【问题标题】:Using ListView from Scala 2.9.2 with Java 7 gives compile error将 Scala 2.9.2 中的 ListView 与 Java 7 一起使用会产生编译错误
【发布时间】:2012-10-26 13:29:31
【问题描述】:

我正在开发一个使用 scala 2.9.2 和 java 7 的项目。

我想要做的是使用 scala ListView 创建一个 GUI。

这是一个小代码sn-p:

private val listView = new ListView[Document](someList)
.
.
.
for (selectedDocument <- listView.peer.getSelectedValuesList) {
    doSomething(selectedDocument)
}

这给了我以下编译错误:

error: something is wrong (wrong class file?): class JList with type parameters [E] gets applied to arguments [], phase = namer for (selectedDocument <- listView.peer.getSelectedValuesList) {

我猜这是因为在 ListView 中,peer 是在没有类型参数的情况下定义的:

override lazy val peer: JList = new JList with SuperMixin

所以问题是:是否不可能将 scala-swing 中的 ListView 与 Java 7 一起使用?

【问题讨论】:

    标签: scala listview java-7 scala-2.9


    【解决方案1】:

    问题是许多 Swing 组件在 Java 7 中已经“泛化”,导致不兼容。 scala 库肯定是针对 Java

    更新:有人偶然发现了同样的问题: http://comments.gmane.org/gmane.comp.lang.scala.debate/9158

    【讨论】:

    • 糟糕的是,Scala 中还没有解决这个问题。在我的应用中使用 Listview 需要我的用户拥有 jre6,还是我错过了什么?
    • 据我所知,这是不正确的。针对 Java 1.6 编译的代码可以很好地在 JVM 1.7 版本上运行(反之则行不通)。
    【解决方案2】:

    通过扩展 Scala 的 ListView 并添加“类型化对等点”解决了这个问题。

    class ExtendedListView[A: ClassManifest] extends ListView[A] {
        lazy val typedPeer: JList[A] = peer.asInstanceOf[JList[A]]
    
        def selectionEmpty = typedPeer.isSelectionEmpty
    
        // Other functions omitted
    }
    

    效果很好!

    【讨论】:

      【解决方案3】:

      我编写了一个小型库SwingPlus,这使得在Java 6 和Java 7+ 上编译时都可以使用ListView。问题(正如其他人指出的那样)是 Java 7 中 Swing 的泛化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 2021-12-14
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多