Пожалуйста, рассмотрим следующий пример:Что определяет, какой функциональный интерфейс создать из лямбда?
import java.util.function.Consumer;
public class Example {
public static void main(String[] args) {
Example example = new Example();
example.setConsumer(test -> System.out.println("passed string is " + test)); //uses MyConsumer, why ?
example.getConsumer().accept("Test 1");
example.setConsumer((MyConsumer<String>)test -> System.out.println("passed string is " + test)); //uses MyConsumer
example.getConsumer().accept("Test 2");
example.setConsumer((Consumer<String>)test -> System.out.println("passed string is " + test)); //uses Consumer
example.getConsumer().accept("Test 3");
}
private Consumer<String> consumer;
public Consumer<String> getConsumer() {
return consumer;
}
public void setConsumer(Consumer<String> consumer) {
this.consumer = consumer;
}
public void setConsumer(MyConsumer<String> consumer) {
this.consumer = consumer;
}
@FunctionalInterface
public interface MyConsumer<T> extends Consumer<T> {
@Override
default void accept(T value) {
System.out.println("In consumer string: " + value); //example thing to do
receive(value);
}
void receive(T value);
}
}
Что меня интересует вот первый тест. Почему он использует MyConsumer вместо Consumer? Что делать, если бы у меня было больше разных Потребителей с той же структурой лямбды, у кого есть приоритет? Кроме того, листинг, который я делаю на Test 2, отмечен как Redundant
моей IDE. Это означает, что lamdba сначала создается как MyConsumer. Почему так ?
Я использую IntelliJ Idea с Javac.
Я не знаю, какую IDE вы используете. Я думаю, что это JVM, использующий тип времени выполнения объекта, который «решает». – duffymo
Я думаю, что Java выбирает наиболее специфический тип, который в этом случае является «MyConsumer». Если 'MyConsumer' не был подпоследователем' Consumer', я думаю, вы получили бы ошибку, заявив, что это неоднозначный звонок. – marstran
Он выбирает наиболее специфический метод. Если у вас был, например, «MyConsumer2 extends Consumer » и 'setConsumer (MyConsumer2 потребитель)', тогда первый вызов был бы неоднозначным, и у вас была бы ошибка времени компиляции. См. Также [JLS 15.12.2.5] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5). –