【发布时间】:2018-12-19 19:59:39
【问题描述】:
我正在使用匿名函数和函数式接口,我有一个函数式接口,它接受两个相同类型的对象并返回 true 或 false。
package elementutils;
@FunctionalInterface
public interface TwoElementPredicate <T> {
public boolean compare(T a, T b);
}
我在另一个类中使用函数式接口使用匿名函数获取“更好的元素”,betterElement 方法接受两个对象和函数式接口的实例。然后我应该能够创建 lambdas 来比较 main 中相同类型的两个对象。
package elementutils;
public class ElementUtils <T> {
public T betterElement(T a, T b, TwoElementPredicate elements){
if (elements.compare(a, b) == true) {
return a;
}else {
return b;
}
}
public static void main(String[] args) {
//String x= ElementUtils.betterElement("java", "python", (a, b) -> a.length() < b.length());
//int y= ElementUtils.betterElement(2, 3, (a, b) -> a > b);
//double z= ElementUtils.betterElement(2.5, 3.7, (a, b) -> a > b);
// all this give errors
}
}
函数应该接受任何对象,只要它们来自同一类型。我以为我可以使用泛型类来实现这一点,但是当我实例化 lambda 时,似乎元素总是对象类型,所以我不能使用 length() 并且不能将它们分配给例如 String。
我希望我的解释正确,任何帮助将不胜感激。
【问题讨论】:
-
我希望我的解释正确:不。您尝试编译/执行什么代码?你期望会发生什么?反而发生了什么?准确吗?
-
我试图执行 main 中的代码,也就是被注释的代码。当我想要不同的类型时,我只得到对象:字符串、整数、双精度。
-
不要解释你得到的错误。发布它们。 我希望此代码能够编译,但我收到以下错误:
-
另外,不要忽略编译器警告。
-
附带说明,以您调用
betterElement方法的方式,您似乎打算将其声明为public static <T> T betterElement(...),而不是将类型参数放在类上。跨度>
标签: java generics functional-programming anonymous-function functional-interface