2011-11-22 38 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/ –