В качестве более описательного интерфейса, я хотел бы создать следующее:Java 8/лямбды/Струйные: Наследование Функция <T,R> приводит к проблемам с andThen() метод
@FunctionalInterface
public interface Dial extends Function<Double,Double> {}
Однако, когда я пытаюсь слагающим Dial
экземпляров как это:
public class DialExample {
public Dial dialMult (double mult) {
return (i -> i * mult);
}
public void myTest() {
// Yes
Function<Double,Double> f1 = dialMult(3.0).andThen(dialMult(4.0));
// No
Dial d1 = dialMult(3.0).andThen(dialMult(4.0));
}
}
код под // No
комментарий дает мне следующую ошибку компиляции:
Error:(22, 40) java: incompatible types: no instance(s) of type variable(s) V exist so that java.util.function.Function conforms to lambdas.Dial
Конечно, код под комментарием // Yes
работает, но он поражает цель иметь описательный интерфейс Dial
.
У меня есть несколько вопросов:
- Что это в разработке/реализации Java дженериков и лямбды, что приводит к этому вопросу?
- Есть ли обходной путь?
- Является ли даже хорошей практикой подкласс
Function<Double,Double>
как описательный интерфейс, такой как мой , или я должен избегать этого в первую очередь?
«Циферблат» - это 'Функция <Двойной, двойной>', но 'Функция <Двойной, Двойной>' не обязательно является 'Цифром'. –
Лучше использовать «DoubleUnaryOperator» или, по крайней мере, «UnaryOperator», а не 'Function '. Ваш интерфейс 'Dial' в основном является клоном интерфейса« DoubleUnaryOperator », но без примитивов. –
bcsb1001