gpt4 book ai didi

Java 泛型 : Adding elements to Set 、 Set 和 Set

转载 作者:行者123 更新时间:2023-11-30 02:07:57 26 4
gpt4 key购买 nike

所以我正在修改一些 Java 概念,我发现我在最“复杂”的情况下并不完全理解泛型。我有大约 3 个月的 Java 类(class),很快就要考试,所以我将不胜感激!

在所附示例中,我不明白为什么 1) 和 2) 无效。

提前致谢!

enter image description here

最佳答案

你可以很容易地思考这个问题。一个List<? extends SomeClass>始终生成 SomeClass 的实现。请参阅以下示例:

List<Integer> ints = new Arrays.asList(1,2,3,4);
List<? extends Number> nums = ints; // this does work
Integer i = nums.get(0); // this doesn't
Number num = nums.get(0); // this does again
nums.add(5); // this doesn't too

你看到nums包含对 ints 的引用。因为Integer延伸Number 。如果您阅读nums -list 你总会得到 Number出来。

这对于每个父类(super class)-子类关系都适用。

但是:您无法写入 nums列表。也就是说,因为您确切不知道 nums 实际引用了哪个列表。在上面的示例中,它是 Integer 的列表。 s,当您阅读该列表时,您就知道会看到什么。

<小时/>

List<? super SomeClass> 也是如此这是上面的反转。它将始终使用 SomeClass 的任何实现。再看一下例子:

List<Object> objs = new ArrayList<>();
List<? super String> strings = objs; // this does work
strings.add("Some String"); // this works
String string = strings.get(0); // this doesn't
Object object = strings.get(0); // this does again

现在我们只知道 String 类型的每个元素更具体的可以放入 Strings列表。因为这是上面的反转。如果您尝试阅读该列表,您不知道会得到什么。您可以阅读Object但你永远不会知道他们的实际类别。

<小时/>

这一般称为PECS,代表:Producer extends消费者super 。有关此主题的更多信息可以阅读 this question

关于Java 泛型 : Adding elements to Set<? > 、 Set<?扩展 Integer> 和 Set<? super 整数>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965501/

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