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
都不是ChildASet
可以包含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();