RandomAccess接口,为什么没有方法?

Eld*_*ael 3 java collections random-access

我正在阅读Collections.shuffle(List)javadoc,然后看看RandomAccess javadoc:

List实现使用的标记接口,表示它们支持快速(通常是恒定时间)随机访问.[...]

我想知道为什么这个接口(如Serializable)没有方法?这个的设计原因是什么?

即使只列出"实现"此接口,为什么不将E设置get()为方法呢?我知道并非每个列表都是随机访问,但如果没有方法,我该如何使用这个界面呢?

像这样的东西:

if(object instanceof RandomAccess){
    // should I cast it if no operations can be done? why?
}
Run Code Online (Sandbox Code Playgroud)

此外,只有列表可以是RandomAccess?文件怎么样?

Cor*_*all 10

"标记"界面是一种早于注释的技术; 它是为了将一个类标记为符合某些标准,其中标准与方法无关.

在这种情况下,Shuffle可能在不支持快速随机访问的列表上采取不同的行为.考虑如何改变链接列表; 这很难,对吗?你不能只是在没有遍历列表的情况下说"给我一个随机元素",指向下一个元素的指针.现在将其与ArrayList进行对比.由于列表的存储方式,获取随机元素要容易得多.

没有办法在方法名称中限定"列表如何存储"或"不同访问模式可能有多快或多慢".因此,Java使用标记接口来提供此信息.

在这种情况下,ArrayList将是RandomAccess,而LinkedList则不是.

编辑

那些对标记接口和标记注释之间的差异感兴趣的人将会喜欢Joshua Bloch在Effective Java 2nd Edition中的第37项:"使用标记接口来定义类型".

  • +1用于将标记接口与注释相关联! (3认同)