【问题标题】:Polymorphism:Assigning child class to superclass多态性:将子类分配给超类
【发布时间】:2013-09-01 09:01:51
【问题描述】:

两者都一样吗?

ParentClass object=new ChildClass();

ParentClass object = (ParentClass) new ChildClass();

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

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

我应该如何声明地图?

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

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

【问题讨论】:

    标签: java generics map polymorphism


    【解决方案1】:

    两者都一样吗?

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

    我应该如何声明地图?

    您应该以第一种方式声明它。 Map&lt;String, Parent&gt; 将能够保存 Parent 或其任何子类的实例。

    至于您的第二次声明:

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

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

    相关帖子:

    参考:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        前两个在效果上是相同的。不需要强制转换。

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

        Map<String,Parent>
        

        如果你声明

        Map<String,T extends Parent>
        

        它声明了一个从StringT 类型的特定子类的映射。类型参数需要在别处指定(作为包含类或封闭方法的类型参数)。请注意,您不能实例化未绑定类型的 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>();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          • 2011-09-09
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          相关资源
          最近更新 更多