gpt4 book ai didi

java - 与在 Java 中表示集合的集合混淆?

转载 作者:行者123 更新时间:2023-11-29 03:17:57 25 4
gpt4 key购买 nike

我想编写返回集合的幂集的程序。我的初始方法签名是这样的: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 中表示集合集合的方式有哪些?

最佳答案

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

  • 是一个接口(interface),可以用它的任何实现替换,例如:HashSet、TreeSet 等;所以你不应该限制你的方法只接受 HashSet<Integer>

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

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

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

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

那是因为编译器期望通用类型之间存在匹配。例如你不能做:Set<Number> set = new HashSet<Long>();尽管Long延伸Number因为它与变量声明定义的类型不同,Number在这种情况下。

如果你真的希望能够调用:new HashSet<HashSet<Integer>>() ;你必须这样做:

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

通过使用通配符,您可以向编译器指定您正在使用实现 Set 接口(interface)的东西。

关于java - 与在 Java 中表示集合的集合混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25399199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com