gpt4 book ai didi

java - 如何将 List> 添加到 Set 中?
转载 作者:塔克拉玛干 更新时间:2023-11-01 22:20:05 26 4
gpt4 key购买 nike

在ExecutorService的开发过程中,有必要将List放在Set中。如何做到这一点?

public class Executor {
private Set<List<Future<Object>>> primeNumList = Collections.synchronizedSet(new TreeSet<>());

Set<List<Future<Object>>> getPrimeNumList() {
return primeNumList;
}

@SuppressWarnings("unchecked")
public void setup(int min, int max, int threadNum) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
List<Callable<Object>> callableList = new ArrayList<>();

for (int i = 0; i < threadNum; i++) {
callableList.add(new AdderImmediately(min + i, max, threadNum));
}
List<Future<Object>> a = executorService.invokeAll(callableList);
primeNumList.add(a); // here i try to add Future list into Set
System.out.println(primeNumList);
executorService.shutdown();
}

我在其中处理值并通过 call() 返回它们的类。之后,它们从我希望它们放置在最终集合中的位置落入列表中

public class AdderImmediately implements Callable {
private int minRange;
private int maxRange;
private Set<Integer> primeNumberList = new TreeSet<>();
private int step;

AdderImmediately(int minRange, int maxRange, int step) {
this.minRange = minRange;
this.maxRange = maxRange;
this.step = step;
}

@Override
public Object call() {
fillPrimeNumberList(primeNumberList);
return primeNumberList;
}

private void fillPrimeNumberList(Set<Integer> primeNumberList) {
for (int i = minRange; i <= maxRange; i += step) {
if (PrimeChecker.isPrimeNumber(i)) {
primeNumberList.add(i);
}
}
}
}

是否有可能以某种方式实现?因为我现在拥有的是 ClassCastException。还是我不明白什么?)

异常(exception):

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at java.util.Collections$SynchronizedCollection.add(Collections.java:2035)
at Executor.setup(Executor.java:22)
at Demo.main(Demo.java:47)

最佳答案

您无法在编译时捕获错误,因为您使用了 @SuppressWarnings("unchecked") .删除它时,此语句会出现编译警告:callableList.add(new AdderImmediately(min + i, max, threadNum));

第二个问题是,您在创建 AdderImmediately 时没有使用通用形式类(class)。你明显回来了,Set<Integer>call 输入方法。如果您在您的案例中使用正确的通用形式,即 Callable<Set<Integer>> ,问题在上面的行中变得很清楚。 callableList 的类型是List<Callable<Object>> .你cannot add an element of type Callable<Set<Integer>> into it .

因为您通过抑制一般警告添加了不正确类型的元素,所以您得到 ClassCastException在运行时。

我建议您阅读 Effective Java 第 3 版中有关泛型的章节,以更好地理解这些概念。

关于java - 如何将 List<Future<Object>> 添加到 Set<Object> 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52291119/

26 4 0