2011-11-22 22 views
6

我有一個奇怪的編譯錯誤。違規行是:在Scala中需要數組[無java.lang.Object] 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[],其可以是在Java String[]或任何數組類型,因爲數組是協變,但在斯卡拉他們不是,所以我們必須使用Array[Object],這應該不成問題。

爲什麼編譯器期望Array[Nothing with java.lang.Object]?我該如何解決它?

這似乎是Scala 2.9.1版本的新增功能。我的應用程序用於編譯,直到兩天前我安裝了2.9.1。令人困惑/令人擔憂的是,我沒有改變IntelliJ中的項目編譯器庫版本,但它似乎正在使用它,可能是從我的SCALA_HOME環境變量中獲取它?

回答

7

我認爲這不是一個斯卡拉2.9.1的問題,但新的JDK。在JDK7中JComboBox是通用的,在您的代碼中它是JComboBox[Nothing]。您應該明確聲明comboBoxLanguage變量爲

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

非常好,解決了它,謝謝。我不知道爲什麼IntelliJ試圖使用Java 7編譯它,因爲它在Project SDK字段中設置爲「1.6」。所以我已經在運行配置中取消了「make」,並且讓sbt使用正確的Java版本(6)進行編譯。 –

+0

@LuigiPlinge(使用java 7編譯),這看起來像是一個經典問題,使用java 7進行編譯時,即使處於兼容模式,也使用java 7庫。如果你使用的是maven,你可以看看http://mojo.codehaus.org/animal-sniffer/ –