2 回答

TA贡献1830条经验 获得超3个赞
(Collection<T extends E> c)
, T 和 ? 可以相同,尤其是如果?是这样使用的(Collection <? extends E) c)
。此处违反了通配符(Collection<? Extends E>)
的使用,因为现在这是针对特定对象层次结构而不是针对所有对象类型
通配符不应仅限于特定的对象类型。
但是你需要指定T的类型,基本上T必须是某个对象层次结构的一个实例。
通配符可以是任何类型。
public default <T> T[] toArray(T[] array)
这是哪里用的?与 T 相同,因为没有定义 T 的类型,因为在命名或指定类型时不能使用任何特殊字符,所以可以用 T 代替?。这是一个接口方法,有人必须实现具有此方法的接口并提供 T,并且 T 可以是 aLinkedList
或 any Object
。

TA贡献1789条经验 获得超10个赞
public default boolean addAll(Collection<? extends E> c)
假设你有class A和class B extends A。然后List<A>.addAll会做类似的事情:
void addAll(Set<B> bs) {
for (A a : bs) {
add(a);
}
}
public default <T> T[] toArray(T[] array)
当然default允许有一个在接口中实现的方法。
要将 a 转换List<T>为数组T[]存在一个问题:在运行时 java 的类型擦除意味着只有一个对象列表。为了接收数组元素的正确类,设计从
List<C>
C[] toArray() // NOT possible,
<T> T[] toArray(T[] sample)
如果参数(sample此处)具有正确的大小,则采用该数组,否则创建一个新数组。
List<String> list = ... // At runtime simply a List of Object.
String[] array = list.toArray(new String[list.size()]); // Created array taken.
String[] array = list.toArray(new String[0]); // New array created.
现在人们可能会认为第一个版本更优化,最好。事实上,人们经常提到使用更间接的形式。
然而,它向我展示了第二个版本更快。它使用其他字节码数组构造。
添加回答
举报