2011-11-22 14 views
6

Tôi gặp lỗi biên dịch lạ. Các dòng vi phạm là:Mảng [Không có gì với java.lang.Object] bắt buộc trong Scala 2.9.1

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

và các lỗi:

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

Theo javadoc constructor của DefaultComboBoxModel hy vọng một Object[], mà có thể là một String[] hoặc bất cứ loại mảng trong Java, vì mảng là một hiệp biến nhưng ở Scala thì không, vì vậy chúng tôi phải sử dụng Array[Object], điều này không phải là vấn đề.

Tại sao trình biên dịch mong đợi Array[Nothing with java.lang.Object]? Làm thế nào tôi có thể sửa chữa nó?

Điều này có vẻ là mới với phiên bản 2.9.1 của Scala. Ứng dụng của tôi được sử dụng để biên dịch cho đến khi tôi cài đặt 2.9.1 một vài ngày trước. Một điều đáng lo ngại/lo lắng là tôi đã không thay đổi phiên bản thư viện trình biên dịch dự án trong IntelliJ, nhưng bằng cách nào đó nó dường như đang sử dụng nó, có lẽ lấy nó từ biến môi trường SCALA_HOME của tôi?

Trả lời

7

Tôi nghĩ rằng đó không phải là vấn đề về scala 2.9.1 mà là JDK mới. Trong JDK7 JComboBox là thông thường và trong mã của bạn, nó là JComboBox[Nothing]. Bạn nên khai báo rõ ràng các biến số comboBoxLanguage dưới dạng

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

Tuyệt vời, giải quyết nó, cảm ơn. Tôi không biết tại sao IntelliJ lại cố gắng sử dụng Java 7 để biên dịch nó, vì nó được đặt thành "1.6" trong trường SDK dự án. Vì vậy, tôi đã bỏ chọn "make" trong cấu hình chạy, và để sbt làm việc biên dịch bằng cách sử dụng phiên bản Java chính xác (6). –

+0

@LuigiPlinge (biên dịch với java 7), điều này có vẻ như đó là một vấn đề kinh điển, khi biên dịch với java 7, bạn đang sử dụng thư viện java 7, ngay cả khi bạn đang ở chế độ tương thích. Nếu bạn đang sử dụng maven, bạn có thể xem http://mojo.codehaus.org/animal-sniffer/ –