代码之家  ›  专栏  ›  技术社区  ›  George

具有通配符泛型类型的Lambda

  •  4
  • George  · 技术社区  · 6 年前

    在java中,我有以下lambda:

    Function<? extends Number, Boolean> f = i -> true;
    

    public <T extends Number> Boolean use(T n) {
      return f.apply(n);
    }
    

    但是编译器给出了“不兼容类型:T不能转换为#1 of?扩展java.lang.Number'

    那么原因是什么?我如何使用我定义的函数?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Eran    6 年前

    申请的问题 Function<? extends Number, Boolean> f = i -> true; 在你的 <T extends Number> Boolean use(T n) 方法是您可以指定给 f 取一个子类的参数的函数 Number (说 Double )而你的 use 方法将尝试向其传递 (说 Integer ).

    Function 定义到

    Function<Number, Boolean> f = i -> true;
    

    它将接受扩展的任何类型 作为论据。

    功能 以及单个泛型类中的方法,这将确保将参数传递给 use() 必须与所需的参数匹配 f :

    class Generic<T extends Number> {
        Function<T, Boolean> f = i -> true;
    
        public Boolean use(T n) {
            return f.apply(n);
        }
    }
    
        2
  •  2
  •   Eugene    6 年前

    你想让它通过 Function 定义应为:

    static Function<? super Number, Boolean> f = i -> true;
    

    问题是这些定义是不相关的,你可以提供一个 功能 扩展数字的类型,而 use 其他 扩展数字的类型。

    或者创建一个将这两个类包装在一起的类(如Eran所示);或者宣布你的 Number ; 或者任何至少能成为 ? super Number