为什么我不能将我的超类对象分配给扩展类?
问题描述:
为什么我不能我的超类对象分配给基类为什么我不能将我的超类对象分配给扩展类?
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());
}
}
谁能告诉我为什么这是不可能的。
答
您试图将子类指定给父类。这与你应该做的恰恰相反。
想象一下,你已经有了类:
public class Mammal {
}
public class Dog extends Mammal {
}
public class Cat extends Mammal {
}
你认为这是合乎逻辑的分配:
Cat cat = new Mammal();
是任何一个Mammal
Cat
?
答
您可以添加投编译代码:
package com.*.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.*.main.Alpha cannot be cast to com.*.main.Gamma
at com.*.main.Gamma.main(Gamma.java:21)
因为在Java中,你可以不投基类型的实例亚型
答
否。对子类的引用必须引用其自身或其某个子类(或空值)的实例。因为它行为不正确。
以下程序有什么意义?
Object o = new Object();
String s = (string) o;
int i = s.length();
所有的苹果都是水果,但不是每个水果都是苹果。 –
(我不是downvoter)downvotes的原因:这个问题在这里已经回答了很多次,你应该在这里或谷歌搜索它之前问这里。 –
http://*.com/questions/43296084/why-cant-i-assign-a-parent-class-to-a-variable-of-subclass-type/43296186#43296186 – SilverNak