2012-10-14 23 views
5

Tôi mới dùng Scala và hiện đang tìm hiểu về các loại tham số trong Scala, nơi tôi gặp phải tình huống sau đây.Nhập và nhập các tham số trong Scala

Giả sử tôi có 2 lớp AB, trong đó B là loại phụ của A.

class A { 
... 
} 

class B extends A { 
... 
} 

Vì vậy, tôi có thể nói B <: A.

Điều này cũng có nghĩa là List[B] <: List[A]?

+3

Nó cũng được giải thích rõ ràng về các khóa học Scala từ Martin Odersky (https://class.coursera.org/progfun-2012-001/lecture/83), nhưng bạn sẽ phải đăng ký, nhưng nó có giá trị nó :-) –

Trả lời

19

Trong trường hợp Danh sách, nó B <: A thực sự ngụ ý List[B] <: List[A], vì thông số loại của Danh sách là so khớp. Việc thực hiện một biến thể tham số kiểu có nghĩa là nó chỉ có thể hiển thị trong các vị trí biến đổi trong định nghĩa Danh sách, nghĩa là nó chỉ có thể hiển thị như kiểu trả về của một phương thức, không phải là kiểu tham số. "Tham quan Scala" chứa một phần khoảng variance. Wikipedia cũng có một tốt article about variance. Ba lựa chọn cho sự thay đổi của một số loại là:

  • bất biến: C[A] không phải là một subtype của C[B], không có vấn đề gì về mối quan hệ giữa AB là. Ví dụ về điều này là các cấu trúc dữ liệu có thể thay đổi được như mảng.
  • hiệp phương sai: B <: A ngụ ý C[B] <: C[A]. Ví dụ là cấu trúc dữ liệu bất biến hoặc kiểu trả về của hàm.
  • contravariance: A <: B ngụ ý C[B] <: C[A]. Ví dụ, hàm là contravariant trong các kiểu tham số của chúng.
Các vấn đề liên quan