Java中分配给更广泛类型的不同实现之间的差异

Java中分配给更广泛类型的不同实现之间的差异,java,list,set,Java,List,Set,我知道,将子类实现分配给接口类型的变量以保持灵活性是公认的最佳实践,如下所示: List<Integer> list = new ArrayList<Integer>(); 以及: 将哈希集作为集提供给您,而: Set<String> set = new TreeSet<String>(); Set Set=new TreeSet(); 将树集作为集提供给您,这意味着(除其他外),集将自动排序。但是,自动排序不是类的特定于实现的功能吗?正如注

我知道,将子类实现分配给接口类型的变量以保持灵活性是公认的最佳实践,如下所示:

List<Integer> list = new ArrayList<Integer>();
以及:

哈希集
作为
提供给您,而:

Set<String> set = new TreeSet<String>();
Set Set=new TreeSet();

树集
作为
提供给您,这意味着(除其他外),
将自动排序。但是,自动排序不是类的特定于实现的功能吗?

正如注释中已经正确指出的那样,如果您是通过其接口声明变量,那么您只能访问该接口定义的方法。具体类型之间的主要区别在于实现的性能


但是接口中定义的某些方法也可以选择性地实现。例如,如果实现
Set
接口的具体类型不支持add操作,则接口的方法
add
会抛出一个。
TreeSet
也是一个(除其他外)。我知道这一点,但声明为
Set
的接口,它不是一个
SortedSet
,那么为什么它会被自动排序为
集呢?
列表和
不强制任何排序。。。实现可以随意进行任何排序。是的,但是,子类实现的排序不需要实现特定的方法吗?这些方法在
Set
接口中不可用?据我所知,当您将对象声明为接口并使用子类构造函数时,您将对象限制为仅包含接口所需的方法。我错了吗?@Powerlord:
List
维持秩序。
列表
实现不能自由地对项目进行重新排序,这将破坏
列表
合同。(文档的第一个字:
有序集合
List<Integer> list = new LinkedList<Integer>();
Set<String> set = new HashSet<String>();
Set<String> set = new TreeSet<String>();