2011-07-18 27 views
6

Mã của tôi trông như thế này:Không thể gọi một constructor quá tải tại Scala

val people = Array(Array("John", "25"), Array("Mary", "22")) 
val headers = Seq("Name", "Age") 
val myTable = new Table(people, headers) 

tôi nhận được lỗi cú pháp sau:

overloaded method constructor Table with alternatives: 
    (rows: Int,columns: Int)scala.swing.Table 
    <and> 
    (rowData: Array[Array[Any]],columnNames: Seq[_])scala.swing.Table 
    cannot be applied to 
    (Array [Array[java.lang.String]], Seq[java.lang.String]) 

Tôi không thấy lý do tại sao thay thế thứ hai không phải là đã sử dụng. Có sự phân biệt nào giữa "Bất kỳ" và "_" đang vấp ngã tôi ở đây không?

Trả lời

5

Như đã nói, bạn cần biến mảng của bạn thành loại phần tử của mình, vì Arala của Scala không có biến thể như Java/C#.

Mã này sẽ làm cho nó hoạt ví dụ:

class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_]) 

này chỉ nói với trình biên dịch rằng T nên được hiệp biến (điều này cũng tương tự như Java ? extends T hoặc 's out T C#).

Nếu bạn cần kiểm soát nhiều hơn về những loại được phép và không, bạn cũng có thể sử dụng:

class Table[T <: Any](rowData: Array[Array[T]],columnNames: Seq[_]) 

này sẽ cho trình biên dịch rằng T thể được bất kỳ subtype của Any (có thể được thay đổi từ Any cho lớp bạn yêu cầu, chẳng hạn như CharSequence trong ví dụ của bạn).

Cả hai trường hợp làm việc cùng trong kịch bản này:

scala> val people = Array(Array("John", "25"), Array("Mary", "22")) 
people: Array[Array[java.lang.String]] = Array(Array(John, 25), Array(Mary, 22)) 

scala> val headers = Seq("Name", "Age") 
headers: Seq[java.lang.String] = List(Name, Age) 

scala> val myTable = new Table(people, headers) 
myTable: Table[java.lang.String] = [email protected] 

Edit: Nếu lớp trong câu hỏi không có trong kiểm soát của bạn, khai báo kiểu bạn muốn một cách rõ ràng như thế này:

val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22")) 

Cập nhật

Đây là mã nguồn trong câu hỏi:

// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1] 
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = { 

Tôi tự hỏi nếu ai đó quên để loại bỏ các khắc phục, vì # 2005 được cố định kể từ tháng 5 năm 2011 ...

+0

Tôi nghĩ rằng đây là giả định rằng Bảng là lớp của tôi. Bảng tôi cần là scala.swing.Table. Ngoài ra, asInstanceOf dường như không giúp được gì. –

+0

Cảm ơn, việc gõ rõ ràng thực hiện công việc. (Tôi nghĩ rằng tôi đã thử rằng trước đó nhưng tôi đoán tôi đã sử dụng mã đối tượng cũ.) Tôi thấy tôi có hàng và cột đảo ngược - okay, đó là dễ dàng - và tiêu đề của tôi không hiển thị.Không quan trọng cho những gì tôi đang làm, mặc dù. –

3

Array[Array[String]]không phải một loại phụ của Array[Array[Any]] vì tham số kiểu của Array không phải là biến thể. Bạn nên đọc lên trên co-, contra- and invariance. Điều này sẽ khắc phục sự cố:

val people = 
    Array(Array("John", "25"), Array("Mary", "22")).asInstanceOf[Array[Array[Any]] 
+0

Đúng Tôi không hiểu những người rất tốt. Tuy nhiên, val people: Array [Array [Any]] = Array (Array ("John", "25"), Array ("Mary", "22")) không đưa ra thông báo lỗi. Tôi đoán tôi nên hỏi: "Làm cách nào để sửa mã của tôi?" Cảm ơn! –

Các vấn đề liên quan