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

标签 java inheritance downcast

所以我一直在搞向下转型,试图找出什么有效,什么无效。我有三个类:基类 Animal和两个派生类 DogCat :

private class Animal {
}

private class Dog extends Animal {
}

private class Cat extends Animal {
}

出于明显的原因,编译器不允许使用以下代码:

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

这是因为我将一个派生类转换为另一个派生类,这是不可能的。但是,如果我做 Animal接口(interface)类型和Cat一个接口(interface)类型,然后编译器突然接受它并且没有说任何问题,即使这是不可能的。

private interface Animal {

}

private class Dog implements Animal {

}

private interface Cat extends Animal {

}

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

最佳答案

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

class CatDog extends Dog implements Cat {
}

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

关于java - 为什么编译器允许我将一个实现类转换为另一个实现类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518059/

相关文章:

java - 带有泛型的静态工厂方法

Java 8 并行排序与 Scala 并行排序

java - JSP 的类加载过程是怎样的?

java - 为什么我们可以将 Java 接口(interface)转换为*任何*非最终类?

java - Java中从父列表调用子方法

Java HashMap.put() 无法在 invokeLater createAndShowGui 方法内工作

c++ - 具有继承的全局类比较

c++ - 继承子类时默认的保护级别是多少?

.net - 如何查找哪些类实现了接口(interface) (.Net)

C++ 多态性 : upcasting/re-downcasting and containers of base class, 缺失数据