Java HashSet构造函数中的通配符泛型

Java HashSet构造函数中的通配符泛型,java,generics,wildcard,hashset,Java,Generics,Wildcard,Hashset,javaHashSet实现有一个构造函数: public HashSet(Collection<? extends E> c) { map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(Collection这是因为当HashMap可以包含和继承自E的对象时,您希望能够传递继承E的任何类型的对象的集合,而不仅仅是E

java
HashSet
实现有一个构造函数:

public HashSet(Collection<? extends E> c) {
    map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
} 

public HashSet(Collection这是因为当HashMap可以包含和继承自E的对象时,您希望能够传递继承E的任何类型的对象的集合,而不仅仅是E


如果它是集合,那么您将无法传递一个
ArrayList
,例如F扩展了E。

这是因为当HashMap可以包含和从E继承的对象时,您希望能够传递继承E的任何类型的对象集合,而不仅仅是E


如果它是集合,那么您将无法传递一个
ArrayList
,例如,其中F扩展了E。

这里的概念称为(协方差、反方差)

假设您有以下两个类:

class A {}
class B extends A {}
在这种情况下,您可以说
B
的实例是
A
的实例。换句话说,以下代码完全有效:

A instance = new B();
现在,Java中的泛型类在默认情况下是不变的。这意味着
列表
不是
列表
。换句话说,以下代码不会编译:

List<A> as = new ArrayList<B>(); // error - Type mismatch!
这意味着以下代码将起作用:

HashSet<B> bs = new HashSet<B>();
HashSet<A> as = new HashSet<A>(bs);
HashSet bs=newhashset();
HashSet as=新的HashSet(bs);

它之所以有效是因为
HashSet是一个HashSet这里的概念叫做(协方差,逆变换)

假设您有以下两个类:

class A {}
class B extends A {}
在这种情况下,您可以说
B
的实例是
A
的实例。换句话说,以下代码完全有效:

A instance = new B();
现在,Java中的泛型类在默认情况下是不变的。这意味着
列表
不是
列表
。换句话说,以下代码不会编译:

List<A> as = new ArrayList<B>(); // error - Type mismatch!
这意味着以下代码将起作用:

HashSet<B> bs = new HashSet<B>();
HashSet<A> as = new HashSet<A>(bs);
HashSet bs=newhashset();
HashSet as=新的HashSet(bs);
它之所以有效,是因为
HashSet是一个HashSet
HashSet<B> bs = new HashSet<B>();
HashSet<A> as = new HashSet<A>(bs);