Я думаю, что этот вопрос уже где-то там, но я не смог его найти.
Я не понимаю, зачем нужно иметь функциональный интерфейс для работы с лямбдами. Рассмотрим следующий пример:
public class Test {
public static void main(String...args) {
TestInterface i = () -> System.out.println("Hans");
// i = (String a) -> System.out.println(a);
i.hans();
// i.hans("Hello");
}
}
public interface TestInterface {
public void hans();
// public void hans(String a);
}
Это работает без проблем, но если вы раскомментируете прокомментированные строки, это не так. Зачем? По моему мнению, компилятор должен иметь возможность отличать оба метода, поскольку они имеют разные входные параметры. Зачем мне нужен функциональный интерфейс и взорвать мой код?
EDIT: Связанные дубликаты не ответили на мой вопрос, потому что я спрашиваю о разных параметрах метода. Но я получил некоторые действительно полезные ответы здесь, благодаря всем, кто помогал!:)
EDIT2: Извините, я, очевидно, не носитель языка, но чтобы уточнить:
public interface TestInterface {
public void hans(); //has no input parameters</br>
public void hans(String a); //has 1 input parameter, type String</br>
public void hans(String a, int b); //has 2 input parameters, 1. type = String, 2. type = int</br>
public void hans(int a, int b); //has also 2 input parameters, but not the same and a different order than `hans(String a, int a);`, so you could distinguish both
}
public class Test {
public static void main(String...args) {
TestInterface i = () -> System.out.println("Hans");
i = (String a) -> System.out.println(a);
i = (String a, int b) -> System.out.println(a + b);
i = (int a, int b) -> System.out.println(a);
i.hans(2, 3); //Which method would be called? Of course the one that would take 2 integer arguments. :)
}
}
Все, что я прошу, касается аргументов. Имя метода не имеет значения, но каждый метод принимает уникальный порядок различных аргументов, и из-за этого Oracle может реализовать эту функцию, а просто сделать единственный метод возможным для "Лямбда-интерфейса".