Использование 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.