为什么编译器允许我将一个实现 class 转换为另一个?

Why is the compiler allowing me to cast one implementing class to another?

所以我一直在搞向下转换,试图找出什么可行,什么不可行。我有三个 classes:一个基础 class Animal,以及两个派生的 classes DogCat:

private class Animal {
}

private class Dog extends Animal {
}

private class Cat extends Animal {
}

编译器不允许以下代码,原因很明显:

Dog dog = s.new Dog();
Cat cat = (Cat) dog;

这是因为我将一个派生 class 转换为另一个派生 class,这是不可能的。但是,如果我将 Animal 设为接口类型,将 Cat 设为接口类型,那么编译器会突然接受它并且不会说任何问题,即使这是不可能的。

private interface Animal {

}

private class Dog implements Animal {

}

private interface Cat extends Animal {

}

当我 运行 与之前相同的代码时,它如预期的那样给我一个错误。

之所以允许这样做是因为完全有可能存在另一个 class,如下所示:

class CatDog extends Dog implements Cat {
}

因为这样的class 可能存在,所以将任何(非final)类型的对象转换为任何接口类型都是合法的。