6

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

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

这是一个小代码片段:

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 一起使用吗?

4

3 回答 3

3

通过扩展 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
}

效果很好!

于 2012-12-12T18:38:50.307 回答
1

问题是许多 Swing 组件在 Java 7 中已经“泛型化”,导致不兼容。scala 库肯定是针对 Java < 1.7 的版本编译的。我建议针对 Java 1.6 编译您的 scala 代码。您仍然可以在 Java 1.7 中编译您的 Java 代码并从您的 scala 代码中使用它,此外,针对 Java 1.6 编译的代码可以在 JVM 1.7 上运行。

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

于 2012-11-06T17:14:53.500 回答
0

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

于 2015-11-16T00:13:21.893 回答