我编写了以下方法将我的Arraylist转换为集合:
public static Set<Animal> toSet(){
Set<Animal> aniSet = new HashSet<Animal>(animals);
return aniSet;
}
我想这样做:
public static Set<Animal> toSet(){
return HashSet<Animal>(animals);
}
为什么我收到一条错误消息,指出它无法找到变量HashSet?我是否需要先存储变量?
编辑:必须在我的Hashset之前添加新内容。编码让我感到愚蠢:&#39;)答案 0 :(得分:3)
此代码存在两个问题:
animals
必须来自某个地方;我不认为第一个例子是编译的;和new
时忘记使用HashSet<Animal>
。这可能是预期的行为:
public static <T> Set<T> toSet(Collection<? extends T> data){
return new HashSet<T>(data);
}
然后你可以用:
来调用它ArrayList<Animal> animals = new ArrayList<>();
//do something with the animals list
//...
Set<Animal> theSet = Foo.<Animal>toSet(animals);
通过使用通用静态方法,您可以使用您喜欢的任何类型调用它。使用Collection<? extends T>
,您不仅限于ArrayList<T>
,而是可以使用任何类型Collection
(LinkedList
,HashSet
,TreeSet
,...)。最后,该集合的类型甚至不必是动物。您可以将ArrayList<Cat>
转换为HashSet<Animal>
。
但请注意,此方法没有太多用处:调用它并不比直接使用构造函数短。我看到的唯一真正的优势是你封装你要使用的Set<T>
,这样如果你以后改变主意TreeSet<T>
所有调用此toSet
的方法}}方法将生成TreeSet<T>
而不是HashSet<T>
。