繁体   English   中英

在java中键入不匹配?

[英]type mismatch in java?

我有以下代码:

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,我想了解错误的更深层含义,并且想知道第二个代码段中的错误原因。

说你说; 狗是一种动物,例如

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();

您可以执行AClass b = new BClass(); 但不是BClass b = new AClass(); 因为仅AClassAClass的父BClass 在多态中,这是不允许的。

尝试AClass a = new BClass(); 代替。

李斯科夫替代原则

如果S是T的子类型,则可以将T类型的对象替换为S类型的对象

在您的示例中,这意味着可以将类型A的对象替换为类型B的对象。您正尝试采用另一种方法。 原理的意思是,当您说B是A的亚型时,您可以将B的所有实例都当作A对待。例如,可以将所有狗当作哺乳动物对待。

您的示例要尝试做的是创建哺乳动物并将其像狗一样对待。

您正在尝试执行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
}
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM