两者都一样吗?
ParentClass object=new ChildClass();
ParentClass object = (ParentClass) new ChildClass();
如果我想创建一个将字符串映射到子对象的映射,例如
"dog"->childA;
"cat"->childB
我应该如何声明地图?
Map<String,Parent>
or
Mpa<String,T extends Parent>
我不确定第二个是否正确,但我在某处读过
两者都一样吗?
ParentClass object=new ChildClass();
ParentClass object = (ParentClass) new ChildClass();
如果我想创建一个将字符串映射到子对象的映射,例如
"dog"->childA;
"cat"->childB
我应该如何声明地图?
Map<String,Parent>
or
Mpa<String,T extends Parent>
我不确定第二个是否正确,但我在某处读过
两者都一样吗?
在第二个作业中不需要强制转换。第一个是有效分配。您可以将子类对象分配给超类引用。
我应该如何声明地图?
您应该以第一种方式声明它。AMap<String, Parent>
将能够保存 Parent 或其任何子类的实例。
至于您的第二次声明:
Map<String, T extends Parent> // This won't compile
这不是在声明映射时在类型参数中指定绑定的正确方法。你不能在那里使用有界类型参数。您应该使用通配符绑定,或者仅使用类型参数 - Map<String, T>
,在声明该类型的位置声明边界T
(可能在声明映射的泛型类中)。因此,您可以使用<? extends Parent>
. 以这种方式声明 map 的问题是,您将无法在其中添加任何内容,请接受null
。
相关帖子:
参考:
演员表和非演员表确实是一样的。
对于泛型,如果您使用 声明它<String, ? extends Parent>
,您将无法将内容添加到列表中,因为如果它被声明,则<String, Child>
无法添加父母。如果NewChild
是由另一个开发人员创建的,那么我们无法知道是否使用Parent
、Child
或NewChild
,并且不允许写入。
前两个在效果上是相同的。铸造是不必要的。
如果您希望地图包含混合的子类,则需要声明
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>();