您好我有关于类型转换和继承的一些问题。我一直在做一些阅读,我理解类型转换的要点和基础知识。但是,我并不完全明白我可以在哪里使用它。
考虑这个课程:
class A{
public A(){}
}
A temp = new A();
temp = (Object)temp;
此代码给出了错误"无法从类型Object转换为类型A"。但是,这不会从A类转换为Object类型吗?你能不输入层次结构?
现在我的第二个问题涉及继承等问题。
键入时:
Object temp = new A();
真正发生了什么? temp是A还是对象?
答案 0 :(得分:0)
这里摘录自JLS 8.1.3:
如果是其他任何类的声明 class没有extends子句,那么 class有
Object
类 隐式直接超类。
当然,Object
本身有点特殊(JLS):
除
Object
以外的每个班级都是 扩展(即子类) 单个现有类(第8.1.3节)和 可以实现接口(第8.1.4节)。
每个班级都是Object
的后代。
在您的情况下,您正在尝试将A
的对象存储到名为A
的Class对象中。这不会起作用。你需要这样做:
Object testObject = (Object)temp;
这会将Object
存储到testObject
,其中包含您投放到的Object
类型。
答案 1 :(得分:0)
A a = (Object)temp;
"无法从类型Object转换为类型A"。但是,这不会从A类转换为Object类型吗?你能不输入层次结构?
你是对的
(Object)temp;
正在转换temp
,A
为Object
。但是,这不是编译器所抱怨的。现在你已经有效了,
A a = anObjectNOTAnA
(A = ...
是无效代码。我已将其更改为A a = ...
。)
它说您无法将Object
转换回A
,除非您明确地将其转换为可能会抑制未经检查的投射警告:
A a = (A)anObjectNOTAnA
或
@SuppressWarnings("unchecked")
A a = (A)anObjectNOTAnA
关于你的另一个问题:
Object temp = new A();
真正发生了什么? temp是A还是对象?
当您转换任何类型的对象时,它永远不会更改基础对象的实际类型。 new A()
始终为A
,无论其
A a = new A();
或
Object objButReallyA = new A();
或
@SuppressWarnings("unchecked")
A a = (A)((Object)new A());
如果A
存储在Object
中,那么它只是一个不同的视图"相同的对象。但是,要使用A
特定功能,您必须先将其还原为A
视图:
objButReallyA.getAOnlyField(); //compile error
((A)objButReallyA).getAOnlyField(); //Okay
答案 2 :(得分:0)
这只是因为你不能将超类对象分配给子类引用。
所以你做不到:
temp = (Object)temp;
因为它与:
相同Object newObject = new Object();
A temp = newObject;
您将在此处获得相同的编译错误。
当然你可以这样做:
Object newObject = new Object;
A temp = new A();
newObject = temp;
您可以这样做,因为您可以将子类分配给超类引用
答案 3 :(得分:0)
问题出在最后一行。首先,您通过以下语句向Java承诺temp属于Object类型:
(Object) temp
之后,您尝试将编译器认为属于Object类型的对象分配给应该是A类型的变量。那么总结一下,将temp转换为Object类型的部分很好,问题是当你之后尝试将其分配给期望A类型的变量。
对于第二个问题,temp是A.当使用new关键字创建对象时,对象的类型将始终是紧随其后的任何内容。在您的情况下A.然后,您将temp分配给Object类型的变量,但这不会更改实际的temp类型。有一个类型X的变量只是告诉你,无论变量指向什么,都是X的子类型。