当前位置: 首页 > 知识库问答 >
问题:

Lambda表达式和泛型方法

东方明亮
2023-03-14
interface MyComparable<T extends Comparable<T>>  {
    public int compare(T obj1, T obj2);
}
public static <T extends Comparable<T>> 
       void sort(List<T> list, MyComparable<T> comp) {
    // sort the list
}
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));
interface MyComparable {
    public <T extends Comparable<T>> int compare(T obj1, T obj2);
}

public static <T extends Comparable<T>> 
       void sort(List<T> list, MyComparable comp) {
}
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));

它不编译。它在lambda表达式中显示错误:

“目标方法是泛型的”

好的,当我使用javac编译它时,它显示了以下错误:

SO.java:20: error: incompatible types: cannot infer type-variable(s) T#1
        sort(list, (a, b) -> a.compareTo(b));
            ^
    (argument mismatch; invalid functional descriptor for lambda expression
      method <T#2>(T#2,T#2)int in interface MyComparable is generic)
  where T#1,T#2 are type-variables:
    T#1 extends Comparable<T#1> declared in method <T#1>sort(List<T#1>,MyComparable)
    T#2 extends Comparable<T#2> declared in method <T#2>compare(T#2,T#2)
1 error
sort(list, <T extends Comparable<T>>(a, b) -> a.compareTo(b));
public static <T extends Comparable<T>> int compare(T obj1, T obj2) {
    return obj1.compareTo(obj2);
}
sort(list, SO::compare);

共有1个答案

贺皓
2023-03-14

如果函数接口中的方法具有类型参数,则不能对函数接口使用lambda表达式。参见JLS8第15.27.3节:

lambda表达式是兼容的[..]对于目标类型T,如果T是函数接口类型(§9.8),并且表达式与[..]的函数类型一致T.[..]如果下列所有条件均为真,则lambda表达式与函数类型一致:

  • 函数类型没有类型参数。
  • [..]
 类似资料:
  • 然后调用如下所示: 它不编译。它在lambda表达式中显示错误: “目标方法是泛型的”

  • 问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • 好的,所以方法重载是一件坏事™。既然这个问题已经解决了,让我们假设我实际上想重载一个像这样的方法: 在Java7中,我可以很容易地使用不明确的匿名类作为参数来调用它们: 但这不能编译。编译器(javac,JDK1.8.0_05)不喜欢这样: 对我来说,直觉上,这没有意义。在产生返回值(“value-compatible”)的lambda表达式和产生(“void-compatible”)的lambd

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的

  • IntelliJ一直建议我用方法引用替换我的lambda表达式。 两者之间有什么客观差异吗?