Collection是Java中Object的子类型吗?

时间:2010-11-24 16:42:50

标签: java

Collection<?>是Java中Object的子类型吗?这可能是一个愚蠢的问题,但不是Object每个类的根?

3 个答案:

答案 0 :(得分:13)

没有。 Collection是一个接口,接口不能从类继承 - 因此它们不能从Object继承。 (对于没有实现的接口来说,继承一个可以有实现的类是没有意义的。)

但是,任何实现Collection的类显然都必须从Object继承。因此,您可以将实现Collection的对象视为继承自Object,因为最终他们必须这样做。

这是语义差异,但是在OO理论中的一个重要区别。

更新:对于那些使用Java规范挑战这个答案的人,我引用了这个代码示例,它表明规范没有正确实现,或者只是完全错误。

TestInterface.java

public interface TestInterface {
    public void foo();
}

Test.java

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;
    }
}

同样,因为它允许我们拥有集合的集合,例如。

JLS 4.10.2说:

  

给出类型声明   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的数组。