Trong phương sai Scala có thể được xác định bằng toán tử phương sai như + và - trên đối số kiểu chung. Ví dụ: loại List
là biến thể trong thư viện chuẩn.Khi sử dụng ký hiệu hiệp phương sai hoặc giới hạn chung trong Scala
class List[+A]
Vì vậy, một chức năng với một danh sách hiệp biến thể được định nghĩa như thế này:
def foo[A](list : List[A])
Cũng đúng có thể được mô phỏng với giới hạn chung. Vì vậy, chúng tôi cũng có thể viết điều này
def foo[A](list : List[_:< A])
tất nhiên điều này không có ý nghĩa, bởi vì list
đã là một biến thể. Nhưng cùng một mẹo có thể được thực hiện cho các loại không phải là biến thể. (như Stack
). Tất nhiên, cũng có một kiểu mới có thể được tạo ra từ stack (thừa kế của tập hợp) đó là biến đổi.
Vì vậy, câu hỏi của tôi:
- Khi nào được sử dụng giới hạn chung cho đúng? Và khi nào chúng ta nên tạo một loại biến đổi mới?
- Giới hạn chung chỉ hữu ích cho phương sai hoặc có thể khai báo nhiều hơn (khái niệm ngôn ngữ).
- Nếu chúng chỉ hữu ích cho phương sai, các giới hạn sau đó chỉ để tương thích với Java?
thx trước :)
Tôi tăng gấp đôi câu hỏi này - phương sai là phần khó khăn nhất của Scala và tôi thực sự không hiểu nó khá tốt. "Blah-blah covariant blah xuất hiện ở vị trí tương đối blah-blah": p – Jeriho
Tôi hiểu phương sai khi tôi nhìn vào các định nghĩa của một số đặc điểm chức năng (Function1, Function2, vv) Các đặc điểm chức năng là tất cả các biến thể trên kiểu đầu ra và contravariant trên các kiểu đầu vào (tham số). Ví dụ, một hàm của kiểu «Any => Unit' có thể được sử dụng bất cứ nơi nào một hàm kiểu' String => Unit' được mong đợi, bởi vì hàm 'Any => Unit' có thể lấy một chuỗi làm đầu vào của nó (vì nó có thể lấy bất cứ thứ gì làm đầu vào của nó.) Đây là lý do tại sao các kiểu tham số phương thức là một "vị trí contravariant". –