2011-11-22 12 views
6

ho un errore di compilazione strano. Le righe inutili sono:Array [Niente con java.lang.Object] necessaria a Scala 2.9.1

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

e l'errore:

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"))) 

Secondo JavaDoc costruttore di DefaultComboBoxModel aspetta un Object[], che può essere un String[] o qualsiasi tipo di matrice in Java, poiché gli array sono covariante , ma in Scala non lo sono, quindi dobbiamo usare Array[Object], che non dovrebbe essere un problema.

Perché il compilatore aspettano Array[Nothing with java.lang.Object]? Come posso ripararlo?

Questo sembra essere nuovo con la versione 2.9.1 di Scala. La mia applicazione è stata compilata fino a quando non ho installato 2.9.1 un paio di giorni fa. Una cosa confusa/preoccupante è che non ho cambiato la versione della libreria del compilatore progetto in IntelliJ, ma in qualche modo sembra essere ad usarlo, forse afferrandolo dalla mia variabile d'ambiente SCALA_HOME?

risposta

7

penso che non è un problema di scala 2.9.1 ma nuovo JDK. In JDK7 JComboBox è generico e nel codice che è JComboBox[Nothing]. Devi dichiarare esplicitamente la variabile comboBoxLanguage come

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

Eccellente, questo lo risolve, grazie. Non so perché IntelliJ stava cercando di utilizzare Java 7 per compilarlo, poiché è impostato su "1.6" nel campo Project SDK. Quindi ho deselezionato "make" nella configurazione di esecuzione e lasciare a sbt di eseguire la compilazione utilizzando la versione di Java corretta (6). –

+0

@LuigiPlinge (compilando con java 7), sembra che si tratti di un problema classico, quando si compila con java 7, si stanno utilizzando le librerie java 7, anche se si è in modalità compatibilita. Se stai usando Maven, puoi dare un'occhiata a http://mojo.codehaus.org/animal-sniffer/ –