Collection<?>
是Java中Object
的子类型吗?这可能是一个愚蠢的问题,但不是Object
每个类的根?
答案 0 :(得分:13)
没有。 Collection
是一个接口,接口不能从类继承 - 因此它们不能从Object
继承。 (对于没有实现的接口来说,继承一个可以有实现的类是没有意义的。)
但是,任何实现Collection
的类显然都必须从Object
继承。因此,您可以将实现Collection
的对象视为继承自Object
,因为最终他们必须这样做。
这是语义差异,但是在OO理论中的一个重要区别。
更新:对于那些使用Java规范挑战这个答案的人,我引用了这个代码示例,它表明规范没有正确实现,或者只是完全错误。
public interface TestInterface {
public void foo();
}
import java.lang.*;
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) {
Class ti = TestInterface.class;
Class sti = ti.getSuperclass();
System.out.println("superclass is null: " + (sti == null));
for (Method m : ti.getMethods()) {
System.out.println(m.getName());
}
}
}
在我的系统上(根据Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
java -showversion
),编译程序的输出是:
superclass is null: true foo
所以我很抱歉,但是没有,接口在技术上不从任何东西继承(除了可能的其他接口),并且它们不继承Object
的方法。
答案 1 :(得分:6)
是的,Collection<?>
是引用类型,因此是java.lang.Object
的子类型。
这很容易检查:
import java.util.Collection;
class Assign {
public Object check(Collection<?> things) {
return things;
}
}
同样,因为它允许我们拥有集合的集合,例如。
给出类型声明 C,直接超类型 参数化类型(§4.5) C是以下所有:
[...]
- 类型为Object,如果C为 接口类型没有直接 超接口。
答案 2 :(得分:3)
是。任何接口类型都是Object
的子类型。
我认为这里存在很多混淆(我的意思是cdhowie的错误答案和它收到的大量赞成)是围绕对“子类型”一词的错误理解。 “Subtype”是由Java语言规范定义的编译时概念,它表示两种类型之间的关系。虽然子类型关系在JLS中的各个位置使用,但类型为S
的子类型的类型T
实际上意味着 S的实例始终也是T 的一个实例。鉴于此,对于类型为S
的引用,如果没有强制转换而没有生成编译器错误,则T
必须 S
的子类型!
因此,以下代码合法的事实实际上是 proof ,Java语言将接口类型T
视为类型Collection
的子类型,只是正如JLS指定的那样。
Object
cdhowie的“证据”表明他的答案是正确的,除了方法Collection<?> collection = ...
Object obj = collection;
和Class.getSuperclass()
遵守他们在文档中指定的合同外,实际上并没有证明任何其他内容......这与其无关Java的“类型”概念。
Class.getMethods()
:
如果此
Class.getSuperclass()
表示Class
类,接口,基本类型或void,则返回null。
Object
:
如果此Class对象表示没有公共成员方法的类或接口,或者此Class对象表示基本类型或void,则此方法返回长度为0的数组。