JAVA编程:链表问题集合<!-?-> c

时间:2019-02-25 06:09:24

标签: java linked-list

您能证明自己如何

public default boolean addAll(Collection<? extends E> c)

具体地

(Collection<? extends E> c)

(Collection<?> c)有效吗?

此外,您能解释一下这是什么意思吗?

public default <T> T[] toArray(T[] array)

2 个答案:

答案 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 Aclass 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.

现在,人们可能会认为第一个版本是最优,最好的。 确实经常提到使用更间接的形式。

不过,据显示,第二版速度更快。它使用其他字节码数组构造。