gpt4 book ai didi

Java8 类型通用删除方法签名和 lambda 不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 01:40:45 24 4
gpt4 key购买 nike

解释这一点的最好方法是举个例子:

public class Cosmos<T> {
public void says(Consumer<String> stringConsumer) {
stringConsumer.accept("we can");
}
}

我期待这会起作用:

new Cosmos().says(s -> System.out.println(s.length()));

但是,这是行不通的! Java8认为s是一个Object!

但是,如果我用 anything 定义 T,它会起作用:

new Cosmos<Void>().says(s -> System.out.println(s.length()));

方法签名如何与泛型相关?

最佳答案

引入原始类型的整个概念是为了与泛型之前的代码兼容,因此,使用原始类型将有效地为所有<关闭泛型/em> 使用此类型,无论泛型签名是否与类型的声明类型参数相关。

这可以通过下面的代码示例来说明,它在 Java 5 之前产生编译错误并继续产生编译错误:

ArrayList list = new ArrayList();
String[] str = list.toArray(new String[0]);

与通用代码对比

ArrayList<Number> list = new ArrayList<Number>();
String[] str = list.toArray(new String[0]);

可以无错编译,表明toArrayList的类型参数是不相关的(泛型类型系统的一个限制)。

同样,当您使用 new Cosmos() 时,结果是一个原始类型 并且对其调用 says 不会使用泛型类型签名。但是您不需要指定实际类型:

new Cosmos<>().says(s -> System.out.println(s.length()));

将编译无错误。

关于Java8 类型通用删除方法签名和 lambda 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com