Java中的TreeSet

Zeu*_*eus 3 java set treeset

我了解Java最佳实践建议,在声明变量时,通用集接口用于在左侧声明,而特定的实现在右侧声明。

因此,如果我必须声明Set接口,正确的方法是,

Set<String> set = new TreeSet<>();
Run Code Online (Sandbox Code Playgroud)

但是,使用此声明,我无法访问该set.last()方法。但是当我这样声明时

TreeSet<String> set = new TreeSet<>(); 
Run Code Online (Sandbox Code Playgroud)

我可以访问last()first()。有人可以帮我理解为什么吗?

Map*_*psy 5

last()first()是属于特定的方法TreeSet,而不是通用接口Set。当您引用变量时,它是在查看源类型,而不是分配的类型,因此,如果将a存储TreeSet为a Set,则只能将其视为a Set。这实质上隐藏了其他功能。

例如,Java中的每个类都可以扩展Object。因此,这是完全有效的分配:

final Object mMyList = new ArrayList<String>();

但是,ArrayListmMyList不进行类型转换的情况下直接引用时,我们将永远无法使用样式功能,因为所有Java都可以知道它正在处理泛型Object。而已。