结合关于类型转换和继承的java问题

时间:2014-03-17 14:03:51

标签: java inheritance casting

您好我有关于类型转换和继承的一些问题。我一直在做一些阅读,我理解类型转换的要点和基础知识。但是,我并不完全明白我可以在哪里使用它。

考虑这个课程:

class A{

        public A(){}            

}

A temp = new A();

temp = (Object)temp;

此代码给出了错误"无法从类型Object转换为类型A"。但是,这不会从A类转换为Object类型吗?你能不输入层次结构?

现在我的第二个问题涉及继承等问题。

键入时:

Object temp = new A();

真正发生了什么? temp是A还是对象?

4 个答案:

答案 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类型。

这是working on ideone

答案 1 :(得分:0)

A a = (Object)temp;
  

"无法从类型Object转换为类型A"。但是,这不会从A类转换为Object类型吗?你能不输入层次结构?

你是对的

(Object)temp;

正在转换tempAObject。但是,这不是编译器所抱怨的。现在你已经有效了,

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的子类型。