Java Can';t转换泛型集?

Java Can';t转换泛型集?,java,generics,Java,Generics,我今天遇到了一个有趣的问题。考虑下面的代码 public static class Parent {} public static class Child extends Parent {} Set<Child> childs = new HashSet(); Set<Parent> parents = (Set<Parent>)childs; //Error: inconvertible types Parent parent = (Parent)new

我今天遇到了一个有趣的问题。考虑下面的代码

public static class Parent {}
public static class Child extends Parent {}

Set<Child> childs = new HashSet();
Set<Parent> parents = (Set<Parent>)childs; //Error: inconvertible types

Parent parent = (Parent)new Child(); //works?!
公共静态类父级{}
公共静态类子级扩展父级{}
Set childs=new HashSet();
设置父项=(设置)子项//错误:不可转换类型
父项父项=(父项)新子项()//作品

为什么像这样的演员不工作?由于泛型的各种规则,我认为隐式强制转换不起作用,但是为什么显式强制转换不能起作用呢?

强制转换不起作用是因为

如果编译器允许这样做:

List<Child> children = new ArrayList();
List<Parent> parents = (List<Parent>)children;
最后一行将尝试将
父项
分配给
子项
——但是
父项
不是
子项


所有
Child
都是
Parent
(因为
Child扩展了Parent
),但所有
Parent
都不是
Child

A
Set
可以包含
Parent
的任何子类。
Set
可以包含
Child
的任何子类。因此,一个
Parent
的子类不属于
Child
的子类,在其中一个中是允许的,而在另一个中是不允许的,这使得它们是不兼容的类型。

因为一组Child(sic)不是一组Parent。定义泛型(参数化)集实际上与定义新类相同,因此您定义的是两个不相交的类。

不过,泛型的超级类型的工作方式有点不同:

Set<Child> childs = new HashSet();
Set<? extends Parent> parents = childs;

Stéphane

如果你说
HashSet
可能是。@ahmet说
HashSet
在哪里?这是一个有趣的观点。这对我的API造成了巨大的破坏。谢谢你的回答没问题。如果有那么糟糕,并且您不了解参数化API的正确方法,那么可以用一些具体的例子问另一个问题,我来看看。
Set<Child> childs = new HashSet();
Set<? extends Parent> parents = childs;
Parent parent = new Child();