我已经开始回到java了,我有一个关于为对象定义构造函数的一般性问题: 我按照以下语句定义HashSet对象的教程:
Set<String> set = new HashSet<String>(list);
(list是List对象)
我想知道如果我使用这个陈述有什么区别:
HashSet<String> set = new HashSet<String>(list);
谢谢!
答案 0 :(得分:0)
这涉及oops的最重要概念之一,即多态性。如果您使用HashSet
代替set,那么您将无法构建灵活的代码。比如,如果要将对象作为参数传递给方法,那么如果有一天使用Set
接口,则可以传递另一个实现,如TreeSet
,该方法将正常工作。这使得代码松散耦合。
答案 1 :(得分:0)
Java Collections Framework的一个定义特征是它是一个基于接口的类型系统。 API主要通过可以扩展其他接口的接口来定义。基接口为Collection
。
通过这种方式,大多数集合实现(例如ArrayList
,HashSet
等)也可以分配给Collection
类型的变量或参数。这为框架提供了很多表达能力。
大多数Java Collection Framework实现都有一个构造函数,它接受Collection
类型的参数。这被称为&#34;转换构造函数&#34;因为它允许你传入框架中任何类型扩展Collection
接口(并且大多数都是)的集合,并将该集合表示为新构造类型的集合。
换句话说:
List<String> list1 = Arrays.asList(new String[] { "one", "two", "three" });
HashSet<String> set1 = new HashSet<>(list1);
变量set1
最终将包含对HashSet
实例的引用,该实例包含同样位于List
实例list1
中的所有对象。实际上,转换构造函数将数据的表示形式从List转换为HashSet。
尽可能使用对象的接口作为其类型而不是其实现类型通常是最佳做法。这为您提供了更大的灵活性。因此&#34;列出myList = ...&#34;优于&#34; ArrayList myList = ...&#34;。