有 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/