泛型类型实例化和Lambda

时间:2018-07-11 17:26:25

标签: java generics functional-programming anonymous-function functional-interface

我正在使用匿名函数和函数接口,我有一个函数接口需要两个相同类型的对象并返回true或false。

package elementutils;
@FunctionalInterface
public interface TwoElementPredicate <T> {
    public boolean compare(T a, T b);
    }

我在另一个类中使用功能接口来使用匿名函数获取“更好的元素”,更好的方法method接收两个对象和功能接口的实例。然后,我应该能够创建lambda来比较主对象中相同类型的两个对象。

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时,元素似乎始终是object类型的,因此我无法使用length(),也无法将其分配给String。例如

希望我能正确地解释自己,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

您缺少T上的类型参数TwoElementPredicate,因此您使用的是原始类型

您需要声明类型为{strong> elements

的参数TwoElementPredicate<T>

答案 1 :(得分:2)

您对betterElement的定义使用原始TwoElementPredicate,因此其参数将始终为Object。相反,您应该使用与元素相同的T通用参数:

public T betterElement(T a, T b, TwoElementPredicate<T> elements) {
    // Here ----------------------------------------^