具有静态泛型的类型安全,通用,空集合

时间:2010-04-12 21:26:31

标签: java collections

我尽可能返回空集合与null。我使用java.util.Collections

在两种方法之间切换
return Collections.EMPTY_LIST;
return Collections.emptyList();

其中emptyList()应该是类型安全的。但我最近发现:

return Collections.<ComplexObject> emptyList();
return Collections.<ComplexObject> singletonList(new ComplexObject());

我在Eclipse Package Explorer中看到了这个方法:

<clinit> () : void

但我不知道在源代码(1.5)中是如何完成的。这个神奇的tomfoolerie是怎么发生的!!

修改: 静态通用类型是如何完成的?

4 个答案:

答案 0 :(得分:15)

return Collections.<ComplexObject> emptyList();

使用它将消除Eclipse关于非泛型集合的警告。

话虽如此,由于空列表是不可变的并且Java在编译时擦除泛型类型,因此类型化的空列表在功能上与无类型的空列表相同。

答案 1 :(得分:8)

  

编辑:静态通用类型如何   完成?

http://www.docjar.com/html/api/java/util/Collections.java.html

public class Collections {
    ...
    public static final List EMPTY_LIST = new EmptyList<Object>();
    ...
    public static final <T> List<T> emptyList() {
        return (List<T>) EMPTY_LIST;
    }
    ...
}

如果你很好奇,你可以看到实现EmptyList类的链接,但是对于你的问题,这没关系。

答案 2 :(得分:2)

<clinit>是静态初始化程序块。它是一段代码,只执行一次(当加载类时)。

所以,而不是写

class  A  {
   static int x = 5;
}

可以写:

class A {
   static int x;

   static {  // static initializer starts
      x = 5; 
   }
}

这两个类是等价的。在静态初始化程序块中,可以放置任意代码,从而使用复杂计算的结果初始化静态字段。

答案 3 :(得分:1)

<clinit>是在编译期间将类初始化代码收集到的方法的名称。 (也就是说,static {}块内的所有代码,以及源代码顺序中静态成员的初始化者。)

它与方法调用中的显式类型参数无关。