Java HashSet构造函数中的通配符泛型
javaJava 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
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);