Массив [ничего с java.lang.Object] требуется в Scala 2.9.1 - PullRequest
6 голосов
/ 22 ноября 2011

У меня странная ошибка компиляции. Оскорбительные строки:

val comboBoxLanguage = new javax.swing.JComboBox
//...
comboBoxLanguage.setModel(new javax.swing.DefaultComboBoxModel( 
    Array[Object]("Scala", "Java")))

и ошибка:

error: type mismatch;
found   : Array[java.lang.Object]
required: Array[Nothing with java.lang.Object]
Note: java.lang.Object >: Nothing with java.lang.Object, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Nothing with java.lang.Object`. (SLS 3.2.10)
comboBoxLanguage.setModel(new javax.swing.DefaultComboBoxModel( Array[Object]("Scala", "Java")))

Согласно JavaDoc, конструктор DefaultComboBoxModel ожидает Object[], который может быть String[] или любым другим типом массива в Java, поскольку массивы ковариантны, но в Scala это не так, поэтому мы должны использовать Array[Object], что не должно быть проблемой.

Почему компилятор ожидает Array[Nothing with java.lang.Object]? Как я могу это исправить?

Похоже, что это новая версия Scala версии 2.9.1. Мое приложение компилировалось, пока я не установил 2.9.1 пару дней назад. Смущает / беспокоит то, что я не изменил версию библиотеки компилятора проекта в IntelliJ, но каким-то образом она, кажется, использует ее, возможно, захватывает ее из моей переменной среды SCALA_HOME?

1 Ответ

7 голосов
/ 22 ноября 2011

Я думаю, что проблема не в scala 2.9.1, а в новом JDK. В JDK7 JComboBox является общим и в вашем коде это JComboBox[Nothing]. Вы должны явно объявить comboBoxLanguage переменную как

val comboBoxLanguage = new javax.swing.JComboBox[Object]
...