Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSE:泛型和继承/多态性_Java_Generics_Inheritance_Collections - Fatal编程技术网

JavaSE:泛型和继承/多态性

JavaSE:泛型和继承/多态性,java,generics,inheritance,collections,Java,Generics,Inheritance,Collections,我有一个类消息和一个消息列表:列表消息 我不能做列出对象=消息

我有一个
类消息
和一个消息列表:
列表消息

我不能做
列出对象=消息
但我可以做到这一点,而不会出现编译错误:

Object object = messages;
List<Object> myList = (List<Object>) object;
myList.add(new Object());
Object=消息;
List myList=(List)对象;
添加(新对象());

然后,我的
消息
列表可以包含任何对象,而不仅仅是消息对象。为什么会这样?

消息
投射到
列表
将使您的基本
消息
实例被视为
对象
实例,仅此而已(在运行时)

此外,您可以在某个地方将这些
对象
强制转换回
消息
,但编译器不能保证您在运行时不会得到
类异常
(因为可能是您选择
新对象()
实例并尝试将其强制转换为
消息

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


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

包含任何对象的myList列表。消息与此无关。当然,但myList和消息引用的是堆上的同一对象(列表的实例)。在这种情况下,为什么“列表对象=消息”是被禁止的???@robingood如果他将
列表
转换为
列表
,它仍然是同一个对象。Java泛型可以帮助您避免错误。当您对它们进行强制转换时,您将绕过用于防止这种情况发生的检查。如果没有编译错误,则是的。但并非没有编译器警告。打开所有编译器警告,并注意它们。编译器会告诉您您的强制转换不安全。(您甚至可以使用
-Werror
使编译器将它们视为错误。)