gpt4 book ai didi

java - 使用一组对时出现 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 11:07:01 30 4
gpt4 key购买 nike

我想在 Java 中使用一组对,但是当我调用 contains() 来查看它是否已包含特定对时,我总是会得到 ClassCastException >。有没有办法避免这种行为?

它的实例化如下:

private static final Set<Pair<String, String>> BLACKLIST = new TreeSet<>();

BLACKLIST.add(new Pair<String, String>("anytext", "anytext"));

此处调用 contains() 会导致以下 ClassCastException:

if (!blacklist.contains(new Pair<String, String>(localizedFile.getName(), key)))

java.lang.ClassCastException: .common.util.Pair 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)

我使用 java.util 类而不是我自己的类。有没有一种优雅的方法来避免实现重载 common.util.Pair 的新类对?

最佳答案

TreeSet 使用其元素的自然排序除非您在创建 Set 时将任何显式比较器传递给构造函数。

合约规定所有元素都插入该集合必须实现 Comparable 接口(interface)。此外,所有此类元素必须可以相互比较 e1.compareTo(e2) 不得抛出对于集合中的任何元素 e1 和 e2,出现 ClassCastException。

您的代码是

  private static final Set<Pair<String, String>> BLACKLIST = new TreeSet<>();
BLACKLIST.add(new Pair<String, String>("anytext", "anytext"));

由于您没有将显式比较器传递给构造函数,并且您的元素(Pair)都没有实现良好的 Comparable,因此您在向集合添加元素时会遇到类转换异常。

我的建议是 (i) 传递显式比较器

或者(ii)使 Pair 实现 Comparable 如下

public class Pair<T1 extends Comparable<T1>, T2 extends Comparable<T2>> implements Comparable<Pair<T1, T2>> {
T1 firstName;
T2 secondName;

public Pair(T1 firstName, T2 secondName) {
this.firstName = firstName;
this.secondName = secondName;
}

public T1 getFirstName() {
return firstName;
}

public T2 getSecondName() {
return secondName;
}

// elements ordered with first parameter .you can make a better
// comparable as well
@Override
public int compareTo(Pair<T1, T2> o) {
// TODO Auto-generated method stub
return this.firstName.compareTo(o.firstName);
}

}

关于java - 使用一组对时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50874271/

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