为什么我不能将我的超类对象分配给扩展类?

时间:2017-04-18 06:51:57

标签: java

为什么我不能将我的超类对象分配给基类

class Alpha {
    String getType() {
        return "alpha";
    }
}

class Beta extends Alpha {
    String getType() {
        return "beta";
    }
}


public class Gamma extends Beta {
    String getType() {
        return "gamma";
    }

    public static void main(String[] args) {
        Gamma g1 = new Alpha();
        Gamma g2 = new Beta();
        System.out.println(g1.getType() + " "
         + g2.getType());
    }
}

任何人都可以告诉我为什么不可能这样做。

3 个答案:

答案 0 :(得分:2)

您正在尝试将子类分配给父类。这与你应该做的完全相反。

想象一下你上课了:

public class Mammal {
}

public class Dog extends Mammal {
}

public class Cat extends Mammal {
}

您认为分配是否符合逻辑:

Cat cat = new Mammal();

任何MammalCat吗?

答案 1 :(得分:1)

没有。对子类的引用必须引用自身的实例或其子类之一(或null)。因为它的行为不正确。

以下计划有何意义?

Object o = new Object();
String s = (string) o;
int i = s.length();

答案 2 :(得分:0)

您可以添加强制转换以编译代码:

package com.stackoverflow.main;

class Alpha {
    String getType() {
        return "alpha";
    }
}

class Beta extends Alpha {
    String getType() {
        return "beta";
    }
}

public class Gamma extends Beta {
    String getType() {
        return "gamma";
    }

    public static void main(String[] args) {
        Gamma g1 = (Gamma) new Alpha();
        Gamma g2 = (Gamma) new Beta();
        System.out.println(g1.getType() + " " + g2.getType());
    }
}

但它会在运行时给你异常

Exception in thread "main" java.lang.ClassCastException: com.stackoverflow.main.Alpha cannot be cast to com.stackoverflow.main.Gamma
    at com.stackoverflow.main.Gamma.main(Gamma.java:21)

因为在java中你不能将基类型的实例转换为子类型