Использование ListView из Scala 2.9.2 с Java 7 приводит к ошибке компиляции

Я работаю над проектом, который использует Scala 2.9.2 и Java 7.

Я пытаюсь создать графический интерфейс, используя scala ListView.

Вот небольшой фрагмент кода:

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

Таким образом, вопрос: нельзя ли использовать ListView из scala-swing с Java 7?

3 ответа

Решение

Решил эту проблему, расширив ScView ListView и добавив "типизированный узел".

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

    def selectionEmpty = typedPeer.isSelectionEmpty

    // Other functions omitted
}

Работает отлично!

Проблема заключается в том, что многие компоненты Swing были "обобщены" в Java 7, что привело к несовместимости. Библиотека scala, безусловно, была скомпилирована для версии Java <1.7. Я бы посоветовал скомпилировать ваш код Scala для Java 1.6. Вы все еще можете скомпилировать свой код Java в Java 1.7 и использовать его из своего кода scala, и, кроме того, код, скомпилированный для Java 1.6, может работать на JVM 1.7.

ОБНОВЛЕНИЕ: кто-то наткнулся на ту же проблему: http://comments.gmane.org/gmane.comp.lang.scala.debate/9158

Я написал небольшую библиотеку SwingPlus, которая позволяет использовать ListView как при компиляции на Java 6 и Java 7+. Проблема (как уже отмечали другие) заключается в генерировании Swing в Java 7.

Другие вопросы по тегам