微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通用抽象方法 & 函数式接口 & lambda 表达式

如何解决通用抽象方法 & 函数式接口 & lambda 表达式

问题:如果我使用带有函数式接口的 lambda 表达式,函数式接口中的抽象方法不能单独拥有“独立”的泛型参数类型?编译错误见示例3。

示例 1: 我的概念是,当我有一个声明泛型参数类型的抽象方法时,该类型独立于接口泛型。 test() 方法中的 T 独立于接口 MyInterface 中的 T。 请参阅下面的代码

//Example 1
interface MyInterface<T> {
 
    <T> T test(T t);    
}

示例 2: 如果我将 lambda 表达式应用于函数式接口,它的表现会很有趣。见下文。

编译运行成功。 这是我的理解。变量 m 是原始类型。因此,Java 不会检查 test() 方法的通用要求。 Java 并不关心 test() 抽象方法的泛型类型是独立于还是依赖于 MyInterface。所以这种情况下返回的是 Object 类型。 请参阅下面的代码

// Example 2
public class Test{
     
    public  static void main(String... args){
        MyInterface m = (x) -> x;        
    }
 
}
 
interface MyInterface<T> {
 
    <T> T test(T t);    
}

示例 3: 现在,我将变量 m 声明为 MyInterface 类型的参数化类型。 编译器产生错误。 请参阅下面的代码

// Example 3
public class Test{
     
    public  static void main(String... args){
        MyInterface<Integer> m = (x) -> x;     
    }
 
}
 
interface MyInterface<T> {
 
    <T> T test(T t);    
}
  
Test.java:12: error: incompatible types: invalid functional descriptor for lambda expression
                MyInterface<Integer> m = (x) -> x;
                                         ^
    method <T>(T)T in interface MyInterface is generic
  where T is a type-variable:
    T extends Object declared in method <T>test(T)
1 error

示例 4: 最后,我从 test() 抽象方法中取出泛型参数类型。它工作正常。程序编译。 抽象方法“T test(T t)”现在依赖于接口 MyInterface 的泛型 T。 请参阅下面的代码

// Example 4
public class Test{
     
    public  static void main(String... args){
        MyInterface<Integer> m = (x) -> x;     
    }
 
}
 
interface MyInterface<T> {
 
    T test(T t);  
}

解决方法

如果我使用带有函数式接口的 lambda 表达式,函数式接口中的抽象方法不能单独拥有“独立”的泛型参数类型?

正确。您的示例 3 演示了这一点。 (这里更简单的术语是“抽象方法不能是泛型的”:泛型方法是定义自己的类型参数的方法)。

你不能用 lambda 来做,你可以用方法引用来做。

iris

Ideone demo

您已经找到了有关 lambda 的内容。不知道方法引用对你有没有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。