0

两者都一样吗?

ParentClass object=new ChildClass();

ParentClass object = (ParentClass) new ChildClass();

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

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

我应该如何声明地图?

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

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

4

3 回答 3

5

两者都一样吗?

在第二个作业中不需要强制转换。第一个是有效分配。您可以将子类对象分配给超类引用。

我应该如何声明地图?

您应该以第一种方式声明它。AMap<String, Parent>将能够保存 Parent 或其任何子类的实例。

至于您的第二次声明:

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

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

相关帖子:

参考:

于 2013-09-01T09:04:02.240 回答
1

演员表和非演员表确实是一样的。

对于泛型,如果您使用 声明它<String, ? extends Parent>,您将无法将内容添加到列表中,因为如果它被声明,则<String, Child>无法添加父母。如果NewChild是由另一个开发人员创建的,那么我们无法知道是否使用ParentChildNewChild,并且不允许写入。

于 2013-09-01T09:04:34.680 回答
0

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

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

Map<String,Parent>

如果你声明

Map<String,T extends Parent>

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

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

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

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

在这种情况下,您不妨坚持

Map<String,Parent> = new HashMap<String, Parent>();
于 2013-09-01T09:03:21.960 回答