您能证明自己如何
public default boolean addAll(Collection<? extends E> c)
具体地
(Collection<? extends E> c)
和(Collection<?> c)
有效吗?
此外,您能解释一下这是什么意思吗?
public default <T> T[] toArray(T[] array)
答案 0 :(得分:1)
(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可以是LinkedList
或任何Object
。
答案 1 :(得分:0)
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
允许在接口中有一个带有实现的方法。
要将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.
现在,人们可能会认为第一个版本是最优,最好的。 确实经常提到使用更间接的形式。
不过,据显示,第二版速度更快。它使用其他字节码数组构造。