在Java中表示集合集时的混淆?
我想写一个程序,返回集合的幂集合。我最初的方法签名是:在Java中表示集合集时的混淆?,java,set,Java,Set,我想写一个程序,返回集合的幂集合。我最初的方法签名是:private static Set generate(Set s)首先,我对方法签名有疑问:关于方法中参数的类型-应该是Set s,还是我必须更具体一些,写一些类似HashSet s的东西?第二,我的方法的返回类型应该是什么?我可以作为返回类型Set编写吗?或者这不是一个好的做法,我必须更具体一些,即编写类似HashSet的内容 另一件我不太清楚的事情是:如果我像这样留下我的方法签名: 专用静态集生成(集s) 然后我想返回一些集合,它们将是
private static Set generate(Set s)
首先,我对方法签名有疑问:关于方法中参数的类型-应该是Set s
,还是我必须更具体一些,写一些类似HashSet s
的东西?第二,我的方法的返回类型应该是什么?我可以作为返回类型Set
编写吗?或者这不是一个好的做法,我必须更具体一些,即编写类似HashSet
的内容
另一件我不太清楚的事情是:如果我像这样留下我的方法签名:
专用静态集生成(集s)
然后我想返回一些集合,它们将是结果。所以我写了这样的东西:
Set res=new HashSet()代码>
但是编译器抱怨道。为什么我不能这样创建res
,在这个问题中返回结果的最佳选择是什么。在Java中表示集合集的方法是什么?set res=new HashSet();
Set<Set<Integer>> res = new HashSet<HashSet<Integer>>();
根据您的要求,您将创建一组集合。但您正在尝试创建一组hashset。所以编译器不允许这样做。因为集合的集合意味着外部集合可以包含任何集合实现。所以您不应该限制为hashset的集合
Set<Set<Integer>> res = new HashSet<Set<Integer>>();
Set res=new HashSet();
Set res=new HashSet();
根据您的要求,您将创建一组集合。但您正在尝试创建一组hashset。所以编译器不允许这样做。因为集合的集合意味着外部集合可以包含任何集合实现。所以您不应该限制为hashset的集合
Set<Set<Integer>> res = new HashSet<Set<Integer>>();
Set res=new HashSet();
关于Set
vsHashSet
的第一个问题,您一定要选择Set
,因为:
- 是一个接口,可替换为其任何实现,如:HashSet、TreeSet等;因此,您不应该仅将您的方法限制为接受
HashSet
您可以更进一步,使用类似于Set的内容,关于Set
vsHashSet
的第一个问题,您应该选择Set
,因为:
- 是一个接口,可替换为其任何实现,如:HashSet、TreeSet等;因此,您不应该仅将您的方法限制为接受
HashSet
您可以更进一步,使用类似于set的东西。您应该为复杂的数据结构创建一个包装器类。您可以将Set作为参数写入,因此此方法将使用任何实现Set的类。您应该为复杂的数据结构创建一个包装类。您可以将Set作为参数写入,因此此方法将期望任何实现Set的类代码>或者,在Java 7+中,您可以只编写Set res=new HashSet()代码>谢谢,这真的很有帮助!如果我想与返回的类型Set
保持一致,该怎么办?是Set如果您想保持一致,我真的建议这样做,最好的方法是使用:Set
作为返回类型,并以这种方式声明res变量:Set Set=new HashSet()
这样,编译器就不会有任何抱怨,而且您可以向res
变量添加不同类型的集合。例如,您完全可以这样做:res.add(newtreeset())代码>但也:res.add(newhashset())代码>谢谢,这真的很有帮助!如果我想与返回的类型Set
保持一致,该怎么办?是Set如果您想保持一致,我真的建议这样做,最好的方法是使用:Set
作为返回类型,并以这种方式声明res变量:Set Set=new HashSet()
这样,编译器就不会有任何抱怨,而且您可以向res
变量添加不同类型的集合。例如,您完全可以这样做:res.add(newtreeset())代码>但也:res.add(newhashset())代码>
Set<? extends Set<Integer>> set = new HashSet<HashSet<Integer>>();