【问题标题】:Generic type instantiation and Lambdas泛型类型实例化和 Lambda
【发布时间】: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 &lt;T&gt; T betterElement(...),而不是将类型参数放在类上。跨度>

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    你需要将参数elements声明为TwoElementPredicate&lt;T&gt;

    【讨论】:

    • 这是因为betterElement不是静态方法
    • 如果我将 betterElement 设为静态,我会得到:无法对非静态类型 T 进行静态引用
    • 然后去掉类上的类型参数T,使其成为泛型方法public static &lt;T&gt; T betterElement(T a, T b, TwoElementPredicate&lt;T&gt; elements)
    猜你喜欢
    • 2013-10-03
    • 2011-04-02
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多