首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能指定一个如图所示的对象?

为什么我不能指定一个如图所示的对象?
EN

Stack Overflow用户
提问于 2014-05-10 00:22:28
回答 4查看 67关注 0票数 3

我是爪哇的新手。我正在读一本书中关于可比接口和比较器接口的章节。下面的代码写着“想办法修改最后一行代码,使其正常工作”。目前,它还没有编译。最后一行该怎么办?

代码语言:javascript
运行
复制
Hello Friend= new Hello("LOL");
Object myObj = Friend;
Hello myFriend = myObj; // What's wrong with this line ?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-10 00:34:15

代码语言:javascript
运行
复制
Hello Friend= new Hello("LOL");

现在您有了名为Friend的变量,其编译时类型为Hello,引用了一个运行时类型为Hello的对象。

代码语言:javascript
运行
复制
Object myObj = Friend;

现在您有了一个名为myObj的变量,它的编译时类型为Object,它也引用了运行时类型Hello的相同对象。这是允许的,因为每个Hello也是一个Object

代码语言:javascript
运行
复制
Hello myFriend = myObj; // What's wrong with this line ?

这在编译期间失败,因为myObj具有编译时类型Object,并且您试图将它分配给编译时类型Hello的一个新变量。而且大多数Object都不是Hello的,编译器不会试图找出这个特定的编译器是否是,因为这在一般情况下是不可能的。

但是无论如何,您可以通过向您保证这个特定的Object实际上是一个Hello来强制编译器这样做。

代码语言:javascript
运行
复制
Hello myFriend = (Hello) myObj;

这叫做铸造

票数 3
EN

Stack Overflow用户

发布于 2014-05-10 00:33:57

从评论中抄录:

myObj = 5;放在前面的图像,可以这样做,因为它被定义为对象。Hello myFriend = 5是什么意思?

您遇到的问题(“不兼容类型”)是因为您试图将定义为Object的变量(层次结构的顶部)分配给定义为Hello (层次结构中的底部)的变量。在您的情况下,它可能工作,但编译器禁止这一点,因为它没有(可行的)方式知道在之间或之后发生了什么。

这也是一个有效的声明:

代码语言:javascript
运行
复制
Object myObj = Friend;
myObj = 5;

但是,将5分配给Hello类型的变量显然是行不通的。这就是为什么它禁止这一切。

您可以通过显式强制转换(Hello myFriend = (Hello) myObj;)来规避此问题,但如果不可能进行强制转换,则会抛出运行时异常。

票数 1
EN

Stack Overflow用户

发布于 2014-05-10 00:27:27

我想你是说分配,而不是等价物。该行失败,因为运算符是由编译时类型选择的。不能将Object分配给Hello,因为这样就可以将类GoodBye的实例绑定到Hello类型的引用。

这在没有静态类型(因为运行时的类型是兼容的)的其他语言中是可能的,但在Java中是不可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23575888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档