事实是,JVM不知道如何将它们转换回原来的。我们将不得不为此完成任务。考虑这个...
SomeOtherObject obj = arr.get(2); //trying to access the third element
你一定会得到编译时错误(你的代码行之后)。好吧,现在尝试显式转换返回的对象。
SomeOtherObject obj = (SomeOtherObject)arr.get(2);
它工作得很好!为什么?因为get()方法返回的对象与它正在播放的类型兼容。
现在考虑这个还(我知道我不能这样做),只是为了检查,如果JVM能告诉我们哪些对象是什么。
SomeOtherObject obj = (SomeOtherObject)arr.get(1); //1 instead of 2
是的我知道这个数组的第二个成员是一个字符串,我不能这样做。但让我们看看JVM有什么要说的(虽然没有编译器错误)。我们得到的消息是该对象不能转换为指定的类型。 (但我们没有得到对象的确切类型)。
你明白了吗?这里的JVM只知道传递给这个数组的对象只是与Object兼容的对象。它不知道我们是否真的传递了String,int(或者整数,因为原语不能存储在集合中),或SomeOtherObject(Java中定义的任何类是Object的直接子类)。
现在回答你的问题:
(我怎么能得到String和整数恢复正常(虽然我仍然要类型转换它们))的原因是字符串和包装类(Integer是一个包装类)重写了从Object继承的toString()方法。所以打印这些对象会给出实际的价值。 (JVM如何知道将其转换为哪种类型)在返回给用户之前,JVM实际上不知道哪个对象将被转换为哪种类型。它只会返回Object的一个实例(这就是JVM所知道的对象)。我们必须明确地将其转换为适当的类型。
希望我回答了你的问题。如果不清楚,请告诉我。
有关运行时多态性(你的标题问题)详细说明在这个网站给出:http://www.javatpoint.com/runtime-polymorphism-in-java
铸造是不是除了基本类型的情况中的转换。 – EJP