java - 为什么 Collections 参数中的 unmodifiableList 是 <?延伸 T>

标签 java collections

unmodifiableList Collections 中的方法类(class)。它返回 List<T>但在参数中它接受 List<? extends T> .

因此,如果我理解正确,那么此方法接受一个包含 T 个对象或从 T 类继承的对象的列表。 但我不明白为什么 <? extends T>参数中的一部分。我的意思是参数决定了方法的返回类型。如果使用 List<Animal> 调用该方法那么返回将是List<Animal>所以它会是一样的。为什么我们需要这个 <? extends T>?为什么我们不需要 List<T>在参数列表中?我不明白这一点。

如果你能提供一个例子,我会很高兴。 提前致谢!

最佳答案

So if I understand this right then this method accepts a List which has T objects or objects that inherited from T class

这是把事情简单化了。

一个List<Number>只能包含整数。点了一个List<Number>是它被限制为只包含数字实例。并不是说每个实例都必须是数字,特别是数字——这是不可能的,因为 Number是抽象的(Number 本身的实例不可能存在,只有它的某些子类的实例)。 List<Integer>之间的唯一区别仅包含整数和一个 List<Number>只包含整数,就是你可以添加一个 Double实例 List<Number> , 但你不能将它添加到 List<Integer> .

因为一个方法将 List<Something> 作为参数可以调用.add() ,类型系统需要担心差异。它需要这样做即使这个方法实际上没有调用add根本没有,而且从未打算这样做。类型系统不知道这一点,您可以在未来的某个版本中自由更改方法的主体,而不会破坏向后兼容性,因此,这很重要。即使您觉得没有。

这也解释了你的问题:

如果您有一些方法需要 List<Number> , 那么您可以提供 List<Integer>Collections.unmodifiableList ,没关系 - Collections.uL 会给你 List<Number> .这通常会被破坏,因为您可以调用 .add(someDouble)您不应该对整数列表执行此操作,而是 .add不适用于不可修改的对象,所以没关系。

关于java - 为什么 Collections 参数中的 unmodifiableList 是 <?延伸 T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68513979/

相关文章:

java - 尝试使用复杂公式时出现 "Cannot find symbol"错误

java - 套接字编程 : Is extra '\n' added in the golang client or the Java server?

java - 使用 IgnoreCase 按键对 Map<String, Object> 进行排序?

java - 少量条目的 Java Map 最快实现

java - 查找文件中的特定行,将该行及其后的 2 行写入新文件

java - 我可以获得对 List<> 对象的引用(该对象引用其元素之一)吗?

Java,在没有数组的情况下按字母顺序对字符串进行排序

java - weka StringToWordVector 过滤器还原 (java)

java - RSA 加密 :InvalidKeyException: invalid key format

java - hsqldb - 如何替换我的 Highscore(包含前 10 名)表中的值