【发布时间】:2013-04-21 20:44:36
【问题描述】:
当声明一个指向特定类型实例的类类型变量时,对象类型由实例化而不是声明决定。示例:
Object o = new ArrayList<>();
if(o instanceof ArrayList)
System.out.println("ArrayList it is!");
所以,ArrayList 只能使用 Object 的方法和属性,在这种情况下,即使我向下转型。 ArrayList 怎么可能只是部分实现,如果将类型设为 Object 不是更有意义吗?
另外,为什么可以在没有通用声明的情况下使用菱形推理?
【问题讨论】:
-
这应该打印“ArrayList it is!”,但是“ArrayList”看起来很奇怪(应该是 ArrayList 或 ArrayList
-
尝试重新表述您的问题,因为即使是第一句话也似乎有点胡言乱语。 “编程到接口”?你的意思是实现一个接口?为什么用“实际”?
-
不会键入擦除使 ArrayList 和 ArrayList 是相同的类型,Jacob?
-
不,当我们实际使用接口类型的引用变量并使其引用其类也实现它的对象时,我们对接口进行编码。当您使超类引用引用子类对象时,您正在使用继承和(如果您选择)多态性。
-
我认为您混淆了“抽象类”和“接口”这两个术语。抽象类是具有部分实现并且不能被实例化的类。只有它的子类可以被实例化为对象。接口永远不会有任何实现。它仅表示 API 与其实现者之间的合同。 “所有类都有接口”这句话并不完全正确,因为绝对有可能编写一个不实现任何接口的类。
标签: java class inheritance interface casting