多态性:将子类分配给超类

时间:2013-09-01 09:01:51

标签: java generics map polymorphism

两者是否相同?

ParentClass object=new ChildClass();

ParentClass object = (ParentClass) new ChildClass();

如果我想创建一个将字符串映射到子对象的地图,如

"dog"->childA;
"cat"->childB

我应该如何宣布地图?

Map<String,Parent>
or
Mpa<String,T extends Parent>

我不确定第二个是否正确,但我在某处读到了

3 个答案:

答案 0 :(得分:5)

  

两者是否相同?

第二次作业中不需要施法。第一个是有效的任务。您可以将子类对象分配给超类引用。

  

我应该如何宣布地图?

你应该以第一种方式宣布它。 Map<String, Parent>将能够保存Parent或其任何子类的实例。

至于你的第二个声明:

Map<String, T extends Parent>  // This won't compile

这不是在声明map时指定类型参数中绑定的正确方法。你不能在那里使用有界类型参数。您应该使用通配符绑定,或者只使用类型参数 - Map<String, T>,并在声明该类型的地方声明T的边界(可能在您声明地图的泛型类中)。因此,您可以使用<? extends Parent>。以这种方式声明地图的问题在于,您将无法在其中添加任何内容,接受null

相关文章:

<强>参考:

答案 1 :(得分:1)

演员阵容和非演员阵容确实相同。

对于泛型,如果你用<String, ? extends Parent>声明它,你就赢了;因为如果它被声明<String, Child>父母就无法添加,所以你可以在列表中添加内容。如果NewChild是由其他开发人员创建的,那么我们就可以知道是否使用ParentChildNewChild并且不允许写入。

答案 2 :(得分:0)

前两个效果相同。铸造是不必要的。

如果您希望地图包含子类的混合,则需要声明

Map<String,Parent>

如果您声明

Map<String,T extends Parent>

它声明了从StringT类型的特定子类的映射。 type参数需要在别处指定(作为包含类的类型参数或封闭方法)。请注意,您无法实例化未绑定类型的Map。因此,例如:

Map<String,? extends Parent> = new HashMap<String, ? extends Parent>();

生成编译器错误。你能做的最好的是:

Map<String,? extends Parent> = new HashMap<String, Parent>();

在这种情况下你也可以坚持使用

Map<String,Parent> = new HashMap<String, Parent>();