我了解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()。有人可以帮我理解为什么吗?
该last()和first()是属于特定的方法TreeSet,而不是通用接口Set。当您引用变量时,它是在查看源类型,而不是分配的类型,因此,如果将a存储TreeSet为a Set,则只能将其视为a Set。这实质上隐藏了其他功能。
例如,Java中的每个类都可以扩展Object。因此,这是完全有效的分配:
final Object mMyList = new ArrayList<String>();
但是,ArrayList在mMyList不进行类型转换的情况下直接引用时,我们将永远无法使用样式功能,因为所有Java都可以知道它正在处理泛型Object。而已。
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |