繁体   English   中英

通用类型实例化和Lambdas

[英]Generic type instantiation and Lambdas

我正在使用匿名函数和函数接口,我有一个功能接口,它接受两个相同类型的对象并返回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

    }

}

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

我希望我能正确解释,任何帮助都将受到高度赞赏。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM