在Java中表示集合的困惑?

时间:2014-08-20 07:36:23

标签: java set

我想编写一个返回集合的幂集的程序。我的初始方法签名是:private static Set<Set<Integer>> generate(Set<Integer> s)首先,我对方法签名有疑问:关于方法中参数的类型 - 它应该是Set<Integer> s还是我必须更具体并写一些东西像HashSet<Integer> s?第二,我的方法的返回类型应该是什么?我可以写一个返回类型Set<Set<Integer>>或者这不是一个好习惯,我必须更具体,即写一些像HashSet<HashSet<Integer>>的东西吗?

另一件事我不太清楚:如果我保留我的方法签名:

private static Set<Set<Integer>> generate(Set<Integer> s)

然后我想返回一些将成为结果的集合。所以我写了这样的话:

Set<Set<Integer>> res = new HashSet<HashSet<Integer>>();

但编译器抱怨。为什么我不能这样创建res,在这个问题中返回结果的最佳选择是什么。有什么方法可以用Java来表示集合?

2 个答案:

答案 0 :(得分:2)

Set<Set<Integer>> res = new HashSet<HashSet<Integer>>(); 

根据您的要求,您将创建一组集合。但是您正在尝试创建一组hashset。所以Complier不会这样做。因为set set of set set可能包含任何set实现。所以你不应该限制hashset的设置。

Set<Set<Integer>> res = new HashSet<Set<Integer>>(); 

答案 1 :(得分:2)

关于您关于Set<Integer> vs HashSet<Integer>的第一个问题,您绝对应该选择Set<Integer>,因为:

  • 是一个接口,可以用它的任何实现替换,例如:HashSet,TreeSet等;因此,您不应仅限制您的方法接受HashSet<Integer>

你可以更进一步,使用Set<? extends Number>之类的东西。这样,您可以在不同的集合上调用您的方法,例如:Set<Long> , Set<Integer> , etc.

关于返回类型的第二个问题:你应该再次使用最抽象的返回类型(Set<Set<Integer>>,而不是特定的实现HashSet<HashSet<Integer>>

关于你的第三个问题:“为什么我不能这样创建res?”

Set<Set<Integer>> res = new HashSet<HashSet<Integer>>();

这是因为编译器期望泛型类型之间的匹配。例如,即使Set<Number> set = new HashSet<Long>();扩展Long,也不能执行Number,因为它与变量声明定义的类型不同,在这种情况下为Number。< / p>

如果你真的想打电话:new HashSet<HashSet<Integer>>();你必须这样做:

Set<? extends Set<Integer>> set = new HashSet<HashSet<Integer>>();

通过使用通配符,您可以向编译器指定您正在使用实现Set接口的内容。