我是爪哇的新手。我正在读一本书中关于可比接口和比较器接口的章节。下面的代码写着“想办法修改最后一行代码,使其正常工作”。目前,它还没有编译。最后一行该怎么办?
Hello Friend= new Hello("LOL");
Object myObj = Friend;
Hello myFriend = myObj; // What's wrong with this line ?发布于 2014-05-10 00:34:15
Hello Friend= new Hello("LOL");现在您有了名为Friend的变量,其编译时类型为Hello,引用了一个运行时类型为Hello的对象。
Object myObj = Friend;现在您有了一个名为myObj的变量,它的编译时类型为Object,它也引用了运行时类型Hello的相同对象。这是允许的,因为每个Hello也是一个Object。
Hello myFriend = myObj; // What's wrong with this line ?这在编译期间失败,因为myObj具有编译时类型Object,并且您试图将它分配给编译时类型Hello的一个新变量。而且大多数Object都不是Hello的,编译器不会试图找出这个特定的编译器是否是,因为这在一般情况下是不可能的。
但是无论如何,您可以通过向您保证这个特定的Object实际上是一个Hello来强制编译器这样做。
Hello myFriend = (Hello) myObj;这叫做铸造。
发布于 2014-05-10 00:33:57
从评论中抄录:
将
myObj = 5;放在前面的图像,可以这样做,因为它被定义为对象。Hello myFriend = 5是什么意思?
您遇到的问题(“不兼容类型”)是因为您试图将定义为Object的变量(层次结构的顶部)分配给定义为Hello (层次结构中的底部)的变量。在您的情况下,它可能工作,但编译器禁止这一点,因为它没有(可行的)方式知道在之间或之后发生了什么。
这也是一个有效的声明:
Object myObj = Friend;
myObj = 5;但是,将5分配给Hello类型的变量显然是行不通的。这就是为什么它禁止这一切。
您可以通过显式强制转换(Hello myFriend = (Hello) myObj;)来规避此问题,但如果不可能进行强制转换,则会抛出运行时异常。
发布于 2014-05-10 00:27:27
我想你是说分配,而不是等价物。该行失败,因为运算符是由编译时类型选择的。不能将Object分配给Hello,因为这样就可以将类GoodBye的实例绑定到Hello类型的引用。
这在没有静态类型(因为运行时的类型是兼容的)的其他语言中是可能的,但在Java中是不可能的。
https://stackoverflow.com/questions/23575888
复制相似问题