使用Scala 2.9.2中的ListView和Java 7会产生编译错误

时间:2012-11-06 14:59:55

标签: scala listview java-7 scala-2.9

我正在开发一个使用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

所以问题是:使用Java 7中的scala-swing是否无法使用ListView?

3 个答案:

答案 0 :(得分:3)

通过扩展Scala的ListView并添加“typed peer”解决了这个问题。

class ExtendedListView[A: ClassManifest] extends ListView[A] {
    lazy val typedPeer: JList[A] = peer.asInstanceOf[JList[A]]

    def selectionEmpty = typedPeer.isSelectionEmpty

    // Other functions omitted
}

效果很好!

答案 1 :(得分:1)

问题在于许多摆动组件已经被广泛化了#34;在Java 7中,导致不兼容。 scala库当然是针对Java&lt;版本的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

答案 2 :(得分:0)

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