Массив [Ничего с java.lang.Object] не требуется в Scala 2.9.1

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

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]? Как я могу это исправить?

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


person Luigi Plinge    schedule 22.11.2011    source источник


Ответы (1)


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

val comboBoxLanguage = new javax.swing.JComboBox[Object]
person 4e6    schedule 22.11.2011
comment
Отлично, это решает проблему, спасибо. Я не знаю, почему IntelliJ пытался использовать Java 7 для его компиляции, поскольку в поле Project SDK установлено значение 1.6. Поэтому я отменил выбор make в конфигурации запуска и оставил sbt выполнять компиляцию, используя правильную версию Java (6). - person Luigi Plinge; 22.11.2011
comment
@LuigiPlinge (компиляция с помощью java 7), похоже, это классическая проблема: при компиляции с java 7 вы используете библиотеки java 7, даже если вы находитесь в режиме совместимости. Если вы используете maven, вы можете посмотреть mojo.codehaus.org/animal-sniffer - person Matthew Farwell; 22.11.2011