我想编写一个返回集合的幂集的程序。我的初始方法签名是: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来表示集合?
答案 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<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接口的内容。