【发布时间】:2019-12-22 09:21:49
【问题描述】:
所以我一直在搞砸,试图找出什么有效,什么无效。我有三个类:一个基类Animal,以及两个派生类Dog 和Cat:
private class Animal {
}
private class Dog extends Animal {
}
private class Cat extends Animal {
}
出于明显的原因,编译器不允许使用以下代码:
Dog dog = s.new Dog();
Cat cat = (Cat) dog;
这是因为我将一个派生类转换为另一个派生类,这是不可能的。但是,如果我将Animal 设置为接口类型并将Cat 设置为接口类型,那么编译器会突然接受它并且不会说任何问题,即使这是不可能的。
private interface Animal {
}
private class Dog implements Animal {
}
private interface Cat extends Animal {
}
只要我运行与以前相同的代码,它就会像预期的那样给我一个错误。
【问题讨论】:
-
我认为这里的问题是接口
Cat不是一个实现,只是一个与接口Animal没有区别的实现规范(目前)。所以,将狗投给Cat接口并没有错。 -
编译器允许你将任何东西转换为任何东西;这在runtimne是否有效是另一回事。演员表是你告诉编译器我更了解,而你认为是
Foo的东西也是Bar。 -
我更正了你相当混乱的术语。
标签: java inheritance downcast