两者是否相同?
ParentClass object=new ChildClass();
ParentClass object = (ParentClass) new ChildClass();
如果我想创建一个将字符串映射到子对象的地图,如
"dog"->childA;
"cat"->childB
我应该如何宣布地图?
Map<String,Parent>
or
Mpa<String,T extends Parent>
我不确定第二个是否正确,但我在某处读到了
答案 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
是由其他开发人员创建的,那么我们就可以知道是否使用Parent
,Child
或NewChild
并且不允许写入。
答案 2 :(得分:0)
前两个效果相同。铸造是不必要的。
如果您希望地图包含子类的混合,则需要声明
Map<String,Parent>
如果您声明
Map<String,T extends Parent>
它声明了从String
到T
类型的特定子类的映射。 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>();