代码看起来像
public abstract class A {
protected int a;
public A() {}
public A(int _a) {
this.a = _a;
}
}
public class B extends A {
public B() {}
public B(int _a) {
super(_a + 1);
}
}
public class C extends A {
public C() {}
public C(int _a) {
super(_a);
}
public int getA() {
return this.a;
}
}
我所做的就是把B投到C,这对我来说不起作用:
public class Main {
public static void main(String[] args) {
A b = new B(2);
System.out.println(((C)b).getA());
}
}
如果扩展相同的抽象类,我可以将B转换为C吗?
答案 0 :(得分:2)
不,你不能。
比喻将是:
public abstract class Animal {
protected int age;
public A() {}
public A(int _age) {
this.age = _age;
}
}
public class Bulldog extends Animal {
public Bulldog() {}
public Bulldog(int _age) {
super(_age + 1);
}
}
public class Cat extends Animal {
public Cat() {}
public Cat(int _age) {
super(_age);
}
public int getAge() {
return this._age;
}
}
你不会带一只7岁的斗牛犬并假装它是一只7岁的猫。 javac和PETA都不会批准。
答案 1 :(得分:1)
没有。每个类都可以添加自己的方法,因此类C
可以有specialMethod
,而类B
可能没有它。如果可以进行这样的转换,您将能够尝试在specialMethod
的实例上调用此B
,这将是不正常的。
经验法则是:您可以垂直投射,而不是水平投射。
答案 2 :(得分:0)
不,你不能。 B和C无关。
答案 3 :(得分:0)
当你必须自己回答这些问题时,你需要总是问“是一个”问题。
B
投射到A
吗? - > B
是A
吗? - > 是(因为它扩展了A) C
投射到A
吗? - > C
是A
吗? - > 是(因为它扩展了A) B
投射到C
吗? - > B
是C
吗? - > 否(因为它没有扩展或实施C) 答案 4 :(得分:0)
语法正确。但它可能会在运行时期间出现问题。
这是一个类似的案例:
Vector
和ArrayList
都会实施List
public static void main(String args[]) {
List l = new ArrayList();
Vector b = (Vector) l;
b.copyInto(new Object[5]); (ArrayList doesn't have method copyInto)
}
编译好.. 运行时出错:
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Vector
at Test.main(Test.java:9)
答案 5 :(得分:0)
如果课程A
扩展了课程B
,您可以说A is a B
- 这称为多态。
在您的示例中,B
为A
,而C
为A
- 因此您可以拨打B
和A
,和C
和A
。
编译器可以这样做,不需要显式转换。
例如,使用带有List
的{{1}},您可以将A
和B
存储到其中。
但是C
不一定是A
(它可能是B
),所以你必须告诉编译器通过进行显式转换来处理它。 / p>