2011-11-22 3 views
6

私は奇妙なコンパイルエラーがあります。問題の行は、次のとおり配列スカラ2.9.1で[java.lang.ObjectでのNothing]が必要

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のコンストラクタは、配列が共変であるため、JavaでString[]または任意の配列型とすることができるObject[]を期待しますしかし、Scalaではそうではありませんので、私たちは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は一般的でコード内にはです。あなたは明示的にcomboBoxLanguage変数を宣言する必要があります

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

優秀、それは、ありがとう、それを解決します。 IntelliJがJava 7を使用してコンパイルする理由を知ることはできません。プロジェクトSDKの「1.6」に設定されています。そこで、実行コンフィギュレーションで "make"の選択を解除し、正しいJavaバージョン(6)を使用してコンパイルを実行させます。 –

+0

@ LuigiPlinge(Java 7でコンパイル)、これは古典的な問題のようですが、互換性モードであっても、Java 7でコンパイルすると、Java 7ライブラリを使用しています。 mavenを使用している場合、http://mojo.codehaus.org/animal-sniffer/を見ることができます。 –

関連する問題