如果B和C扩展相同的抽象类A,我可以将B转换为C吗?

时间:2014-09-10 08:32:25

标签: java

代码看起来像

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吗?

6 个答案:

答案 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吗? - > BA吗? - > 是(因为它扩展了A)
  • 您可以将C投射到A吗? - > CA吗? - > 是(因为它扩展了A)
  • 您可以将B投射到C吗? - > BC吗? - > 否(因为它没有扩展或实施C)

答案 4 :(得分:0)

语法正确。但它可能会在运行时期间出现问题。 这是一个类似的案例: VectorArrayList都会实施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 - 这称为多态。

在您的示例中,BA,而CA - 因此您可以拨打BA,和CA。 编译器可以这样做,不需要显式转换。

例如,使用带有List的{​​{1}},您可以将AB存储到其中。 但是C不一定是A(它可能是B),所以你必须告诉编译器通过进行显式转换来处理它。 / p>