java中的类型不匹配?

时间:2016-04-22 06:49:20

标签: java subclass superclass

我有以下代码:

public class AClass {
    public AClass() {
        System.out.println("Constructor A");
    }
}

public class BClass extends AClass{
    public BClass(){
        System.out.println("Constructor B");
    }
}

public class Test {
    public static void main(String[] args) {
        BClass b = new BClass();
    }
}

我改变了代码,如下所示:

public class AClass {
    public AClass() {
        System.out.println("Constructor A");
    }
}

public class BClass extends AClass{
    public BClass(){
        System.out.println("Constructor B");
    }
}

public class Test {
    public static void main(String[] args) {
        BClass b = new AClass();
    }
}

在第二个代码段中,我为此更改BClass b = new AClass();收到类型不匹配错误。

我正在学习java,我想了解错误的深层含义,我想知道为什么第二个代码段中的错误?。

4 个答案:

答案 0 :(得分:7)

说你说;狗是一种类似动物的

class Animal { }
class Dog extends Animal {
    public void bark() { }
}
class Cat extends Animal {
    public void meow() { }
}

Animal a = new Dog(); // is ok.

但你不能说;动物是一种狗。

Dog d = new Animal(); // not ok.
d.bark(); // Animal doesn't have a bark();

答案 1 :(得分:4)

您可以AClass b = new BClass();而不是BClass b = new AClass();,因为AClass只是BClass的父级。在多态性中,它是不允许的。

答案 2 :(得分:0)

请尝试AClass a = new BClass();

Liskov substitution principle

  

如果S是T的子类型,则类型T的对象可以用S

类型的对象替换

在您的示例中,这意味着类型A的对象可能会被B类对象替换。您正试图以相反的方式执行此操作。该原则所说的是,当你说B是A的亚型时,你可以将B的所有实例视为A,例如,所有的狗都可以被视为哺乳动物。

你的榜样是创造一种哺乳动物并像狗一样对待它。

答案 3 :(得分:0)

您正在尝试执行downcasting。要使此代码正常工作,只需使用以下代码更改代码:

public class AClass {
    public AClass() {
        System.out.println("Constructor A");
    }
}

public class BClass extends AClass{
    public BClass(){
        System.out.println("Constructor B");
    }
}

public class Test {
    public static void main(String[] args) {
        AClass b = new BClass();
        doDownCasting(b);
    }

private static void doDownCasting(AClass a){
    if(a instance of BClass){
    BClass bClass = (BClass)a; // do the downcasting here
}
}

}