显式类型将子类对象转换为java中的超类

时间:2012-10-11 16:03:22

标签: java casting type-conversion

请考虑以下代码:

public class Test{
  public static void main(String str[]){
     B b = new B();
     A a1 = (A)b;//Explicit type conversion
     A a2 = b;
  }
}
class A{}
class B extends A{}

在上面的代码中有两行:

A a1 = (A)b;//Explicit type conversion
A a2 = b;

等效?如果那么两者之间的差异是什么?如果那么 java中的任何情景我们在哪里需要将子类对象显式转换为超类对象

6 个答案:

答案 0 :(得分:10)

引用的显式类型转换,而不是对象)是多余的,并且某些IDE会建议您删除它。

如果你这样做

A a1 = (A)b;

你仍然可以

B b2 = (B) A;

将引用转换回B类型。

注意:对象不会以任何方式更改,始终为B

  

在java中没有你需要的场景吗?

您需要进行上传的唯一时间是方法选择。

void method(Object o) { }

void method(String s) { }

method("hello");          // calls method(String)
method((Object) "hello"); // calls method(Object)

答案 1 :(得分:3)

使用重载方法选择也需要这种类型转换:

package casting;
public class ImplicitCasting {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A a1 = new B();
        methodA(a);      // methodA called
        methodA((A)b);   // methodA called
        methodA(b);      // methodB called
    }

    public static void methodA(A a) {
        System.out.println("methodA called");
    }

    public static void methodA(B b) {
        System.out.println("methodB called");
    }
}

class A{

}

class B extends A{

}       

答案 2 :(得分:1)

在你的例子中它们不相同。

这变得很重要以其他方式分配,即从AB,而您的对象仍为B

e.g。考虑以下顺序:

      A a = b;// will work
      a = (A)b;// will work
      B newB = (B)a; //will work
      B newB = a;  //will fail

答案 3 :(得分:1)

两者之间没有区别。实际上,您不需要来明确键入强制转换from a subclass object to a super class reference。所以,第一种方式绝对是Redundant

来自JLS - Conversion: -

  

5.1.5。扩大参考转换

     

从任何引用类型S到存在扩展引用转换   任何引用类型T,条件是S是T的子类型(§4.10)。

     

扩展参考转换从不需要特殊操作   运行时,因此永远不会在运行时抛出异常。他们   简单地说,将参考视为在a中具有其他类型   在编译时可以证明是正确的方式。

只有在参考类型不能存储object的地方才需要显式类型转换。但是当你创建一个子类的对象并使超类的引用指向该对象时,编译器就不会有问题。因为总是可以在运行时处理它。

答案 4 :(得分:1)

  

等效?如果不是那么两者之间有什么区别

唯一不同的是,一个是隐式的,而另一个是显式的(不是必需的),结果是等价的。注意:转换适用于对象的引用,而不是对象本身。

  

在java中我们需要将子类对象显式转换为超类对象吗?

Java支持Liskov substitution principle,所以不应该有这样的场景。

答案 5 :(得分:0)

他们都是一样的。这是一个自动向下类型转换的情况。

A a1 =(A)b; //显式类型转换 A a2 = b;

在这两种情况下,a1和a2的类型都是A.所以B的附加特征无论如何都会丢失。

如果你进行非自动的向上类型转换,你就会知道区别。请考虑以下示例。

车辆v1 =新车(); //对 。向上转换或隐式转换

Vehicle v2 = new Vehicle();

Car c0 = v1; //错误的编译时错误“类型不匹配” //需要显式或向下转换 车c1 =(车)v1 //对。向下倾斜或明确的铸造。由于第1行,v1对Car有所了解

车c2 =(车)v2; //错误的运行时异常ClassCastException,因为v2不了解Car。

巴士b1 =新宝马(); //错误的编译时错误“类型不匹配”

Car c3 = new BMW(); //对。上传或隐式投射

汽车c4 =(宝马)v1; //错误的运行时异常ClassCastexception

对象o = v1; // v1只能向其父级转发 车c5 =(车)v1; //由于第1行,v1可以向下转向Car