【问题标题】:Exception: javax.swing.KeyStroke cannot be cast to java.lang.Comparable? Need a reason for this error [duplicate]例外:javax.swing.KeyStroke 不能转换为 java.lang.Comparable?需要此错误的原因[重复]
【发布时间】:2015-06-29 20:09:45
【问题描述】:

我正在开发一个企业应用程序。当系统有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 后为什么会出现错误。显然,实现会有一些变化。但我想了解这一点。 我试图检查击键类的文档。但我没有得到与此相关的任何信息。

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

【问题讨论】:

  • @Jarrod:这个问题没有任何答案。我问为什么当应用程序使用 JDK 1.6 而不是 JDK 1.7 运行时它工作的原因

标签: java swing


【解决方案1】:

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

KeyStroke 没有实现Comparable,因此不提供自然排序。这就是错误的原因。只需提供一个 Comparator 实现,它负责提供一种对键进行排序的方式,例如(按键码排序):

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

更多关于TreeMap的订购要求:How can I sort the keys of a Map in Java?

红黑树(TreeMap 是什么)是如何工作的,这应该阐明为什么密钥需要是可订购的(因为必须确定将其放在密钥树中的哪个位置):Explanation of Red-Black tree based implementation of TreeMap in JAVA

【讨论】:

  • 感谢您的信息。那么,我们的意思是说 JDK 6 有比较器可用吗?
【解决方案2】:

其他 answers 很好地解释了为什么 TreeMap 要求类是 Comparable。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多