提问者:小点点

异常:javax.swing.KeyStroke 不能转换为 java.lang.Comparable?需要此错误的原因 [重复]


我正在开发一个企业应用程序。早些时候,当系统有JDK1.6时,它工作得很好。我将JDK升级到1.7。之后,我得到了错误:

Caused by: java.lang.ClassCastException: javax.swing.KeyStroke cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(Unknown Source)
    at java.util.TreeMap.put(Unknown Source)
    at java.util.TreeSet.add(Unknown Source)

虽然我已经通过在JDK版本之间切换解决了我的问题。我想知道为什么升级到JDK 7后会出现错误。显然,在实施过程中会有一些变化。但是我想知道。我试图检查击键类的文档。但我没有任何相关信息。

有人能解释一下吗?提前感谢。


共2个答案

匿名用户

其他答案很好地解释了为什么TreeMap要求类具有可比性。

其他答案没有解释为什么从Java6更改为Java7后会出现问题。TreeMap的行为对于Java6和7是相同的(我在IDE中检查过)。由于Depency注入,您的代码可能使用了Java7中的另一个实现。只是猜测。你能检查一下地图是如何实例化的吗?

匿名用户

TreeMap要求密钥类是可排序的,因为它创建了一个排序的密钥树。因此,您需要提供一种排序密钥的方法,要么通过自然排序(即在密钥类中实现可比较接口),要么通过在TreeMap构造时提供的比较器类。

按键不实现可比较,因此不提供自然排序。这是错误的原因。只需提供一个比较器实现,该实现负责提供一种对键进行排序的方法,例如(按键码排序):

map = new TreeMap<KeyStroke, YourValueClass>(new Comparator<KeyStroke>() {
  public int compare(KeyStroke o1, KeyStroke o2) {
    return o1.getKeyCode() - o2.getKeyCode();
  }
});

有关TreeMap排序要求的更多信息:如何在Java中对Map的键进行排序?

红黑树(树图是什么)如何工作,这应该澄清为什么键需要排序(因为它必须确定将其放在键树中的位置): 在 JAVA 中基于红黑树的树状图实现的说明