gpt4 book ai didi

Java 通配符捕获

转载 作者:行者123 更新时间:2023-11-30 02:44:49 27 4
gpt4 key购买 nike

<T extends Number> void m1(List<T> list) {
list.add(list.get(0));
}

void m2(List<? extends Number> list) {
list.add(list.get(0));
}

我发现很难理解上述两种方法之间的区别。
第一种方法m1()编译成功,但是方法m2()产生编译器错误:

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (capture#2-of ? extends Number)

最佳答案

因为你不能在有上限的类型列表上添加iten!您可以有一个列表或列表,其中一个列表不适合另一个列表以进行修改操作!

List<? extends Number> list = new ArrayList<Integer>();
List<? extends Number> list = new ArrayList<Double>();
List<? extends Number> list = new ArrayList<Long>();

在这种情况下,变量列表可以具有扩展Number的实例中的任何类型。 。例如,您可以在您的方法中传递它。但在那里,您并不真正知道该类型可能是什么。你可以有一个 ArrayList<Integer>并对其添加一个新的 Double 。在编译时是有意义的,因为 Double延伸Number ,但在运行时列表不能是这种类型并抛出异常。

请记住,当您使用上限时,<? extends T> ,您无法修改该列表,只能阅读它!有Oracle tutorial (参见通配符章节内容 - 上限通配符下限通配符等)

关于Java 通配符捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40506817/

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