【问题标题】:Java SE : generics and inheritance/polymorphismJava SE:泛型和继承/多态
【发布时间】:2020-01-06 10:38:31
【问题描述】:

我有一个class Message 和一个消息列表:List<Message> messages

我不能List<Object> objects = messages;我知道。

但我可以做到这一点而不会出现编译错误:

Object object = messages;
List<Object> myList = (List<Object>) object;
myList.add(new Object());

然后我的messages 列表可以包含任何对象,而不仅仅是 Message 对象。这是为什么呢?

【问题讨论】:

  • 它是包含任何对象的 myList 列表。消息与它不再有任何关系。
  • 当然,但是 myList 和 messages 引用了堆上的同一个对象(List 的一个实例)。在那种情况下,为什么禁止“List objects = messages”??
  • @robingood 如果他将List&lt;Message&gt; 转换为List&lt;Object&gt;,它仍然是同一个对象。
  • Java 泛型可以帮助您避免错误。当你在他们周围施放时,你绕过了防止这种情况发生的检查。
  • 没有编译错误,是的。但并非没有编译器警告。打开所有编译器警告,并注意它们。编译器会告诉你你的演员表是不安全的。 (您甚至可以使用-Werror 让编译器将它们视为错误。)

标签: java generics inheritance collections


【解决方案1】:

messages 转换为List&lt;Object&gt; 将使您的基本Message 实例被视为Object 实例,仅此而已(在运行时)。

此外,您可以在某处将这些Objects 转换回Message,但编译器无法保证您不会在运行时获得ClassCastException(因为可能是您选择了@987654328 @instance 并尝试将其转换为Message)

这实际上是 myList.add(new Object()) 编译的原因 - 编译器不会抱怨,因为添加的实例符合 myList 的内容定义。

与您的问题无关,但可能值得一提的是,实际上非常不鼓励强制转换操作,因为它表明对象设计不佳。

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多