泛型实例化和 Lambdas

Generic type instantiation and Lambdas

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

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

我在另一个 class 中使用函数接口来获取 "better element" 使用匿名函数,方法 betterElement 采用两个对象和函数接口的实例。然后我应该能够创建 lambdas 来比较主体中相同类型的两个对象。

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

    }

}

函数应该接受任何对象,只要它们来自同一类型。我以为我可以使用泛型 classes 实现这一点,但是当我实例化 lambda 时,元素似乎总是对象类型,所以我不能使用 length() 并且不能将它们分配给 String 例如。

希望我的解释正确,如有任何帮助,我们将不胜感激。

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

您需要将参数 elements 声明为类型 TwoElementPredicate<T>

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

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