java 类型安全、泛型、空集合和静态泛型

mrfwxfqh  于 2023-04-28  发布在  Java
关注(0)|答案(5)|浏览(129)

我返回空集合与空的,只要有可能。我使用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).这个神奇的愚蠢是如何发生的!!

EDIT:静态泛型类型是如何实现的?

oprakyz7

oprakyz71#

return Collections.<ComplexObject> emptyList();

使用此方法可以消除Eclipse中关于非泛型集合的警告。
话虽如此,类型化的空列表在功能上与非类型化的空列表相同,因为空列表是不可变的,Java在编译时擦除泛型类型。

yqyhoc1h

yqyhoc1h2#

EDIT:静态泛型类型是如何实现的?
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类实现的链接,但对于您的问题,这并不重要。

voase2hg

voase2hg3#

<clinit>是静态初始化器块。它是一个代码块,只执行一次(当类被加载时)。
所以,与其写

class  A  {
   static int x = 5;
}

可以这样写:

class A {
   static int x;

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

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

mnemlml8

mnemlml84#

<clinit>是编译期间将类初始化代码收集到的方法的名称。(也就是说,static {}块中的所有代码,以及静态成员的初始化器,按源代码顺序排列。)
它与方法调用中的显式类型参数无关。

agxfikkp

agxfikkp5#

对于那些正在寻找类似解决方案的人,但对于更当前的时间(2023年4月),人们已经开始使用List.of()作为Collections.emptyList()的简洁替代品。..
中的方法的前缀相同
Collections.<ComplexObject>emptyList();
使用相同的方法前缀模式:
List.<ComplexObject>of();

相关问题