请考虑以下代码:
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中的任何情景我们在哪里需要将子类对象显式转换为超类对象?
答案 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)
在你的例子中它们不相同。
这变得很重要以其他方式分配,即从A
到B
,而您的对象仍为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