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

仅在方法中定义的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表达式中显示错误:

“目标方法是泛型的”

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表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • 如果我更改了方法的名称,它会进行编译,但它不会重写toString,因此print方法不会打印预期的内容。 这是试图定义一个日志子系统,该子系统仅在需要时(当它真的要打印时)对lambda求值,但与非lambda参数兼容。我知道其他的方法来实现它,但我想知道为什么我不能这样做,如果有一个变通办法或我做错了什么,

  • 问题内容: 我如何写一个等于的lambda表达式: 不允许以下内容: 问题答案: 皮肤化Python的方法不止一种: Lambda接受语句。既然是一条语句,您可以编写一个通用的提升器: 但是,如果您的目标是避免使用,则显然不能削减它。但是,它确实允许您有条件地引发异常,例如: 另外,您可以在不定义命名函数的情况下引发异常。您所需要的只是强健的腹部(给定的代码是2.x): 和python3 强健胃部

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

  • 本文向大家介绍浅谈java中定义泛型类和定义泛型方法的写法,包括了浅谈java中定义泛型类和定义泛型方法的写法的使用技巧和注意事项,需要的朋友参考一下 1、方法中的泛型 2、定义泛型类 以上这篇浅谈java中定义泛型类和定义泛型方法的写法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。