2012-05-12 38 views
5

Im đọc trang này http://www.scala-lang.org/node/137, tôi hiểu hiệp phương sai là gì và cận dưới là tốt, nhưng những gì nó không rõ ràng là dòng này:vọt Scala thấp hơn loại và hiệp phương sai

Thật không may, chương trình này không biên dịch, vì hiệp phương sai chỉ có thể xảy ra nếu biến kiểu chỉ được sử dụng trong các vị trí biến đổi . Vì biến kiểu T xuất hiện dưới dạng kiểu tham số của phương thức thêm, quy tắc này bị hỏng.

tại sao elem phải là một thể hiện của một siêu kiểu của T, nếu ListNode đã hiệp biến tại sao elem không thể được thêm vào phía trước danh sách hiện hành.

+0

Giải thích này khá đơn giản. Loại biến T xuất hiện dưới dạng kiểu tham số. Đây không phải là một vị trí so sánh. Điều gì chính xác đặt ra một vấn đề ở đây? –

Trả lời

2
class Super    {override def toString = "Super"} 
class Sub extends Super {override def toString = "Sub"; def subMethod {} } 
val sup = new Super 
val sub = new Sub 

Hãy tưởng tượng sau đây được phép:

// invalid code 
class Foo[+T] { 
    def bar(x: T) = println(x) 
} 

Kể từ Foo là hiệp biến trên T, đây là hợp lệ (một bị ném lên trời đơn giản, vì một Foo[Sub] là một Foo[Super]):

val foo : Foo[Super] = new Foo[Sub] { 
    override def bar(x: Sub) = x.subMethod 
} 

Bây giờ, foo, theo như chúng tôi biết, Foo[Super] giống như bất kỳ hình thức nào khác, nhưng bar của nó phương pháp này sẽ không hoạt động, vì việc triển khai bar yêu cầu một số Sub:

foo.bar(sup) // would cause error! 
+0

Ok, tôi hiểu, bây giờ từ dòng 'chương trình này không biên dịch' tạo thành trang web scala, không có nghĩa là chúng tôi đang vi phạm điều gì đó trong mã cụ thể này và chúng tôi không phân lớp Foo [SomeClass] một cách rõ ràng, trình biên dịch chỉ là bảo vệ chống lại một lỗi thời gian chạy tiềm năng, tôi có sai không? – loki

+0

Bạn nói đúng, nhưng nó giống như trình biên dịch áp dụng bất kỳ quy tắc nào khác của kiểu gõ tĩnh, như không cho phép bạn gọi các phương thức List trên Strings. Như các chương trình trên, nó sẽ không hợp lý về mặt logic để cho phép sự tranh luận của phương thức là một loại biến đổi, vì vậy nó không cho phép bạn. –

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