2012-03-13 46 views
5

Trong Scala, bạn có thể xác định tham số đi xuống từ một tham số khác lấy tham số đầu tiên làm tham số. Ví dụ: trong Lift, bạn có thể tìm những thứ như vậy trong Bản ghi và MapperCác tham số kiểu Scala lặp lại

MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]] 

Điều đó có ý nghĩa gì và hữu ích như thế nào?

+3

Lưu ý điều tương tự là có thể và thực sự được thực hiện bằng Java hoặc C#. ví dụ: 'SortedStructure >', 'SortedStructure trong đó T: IComparable '. –

Trả lời

9

Đây là mẫu thường được sử dụng để cho lớp trừu tượng biết về loại lớp bê tông thực tế mở rộng nó. Đôi khi rất hữu ích khi biết loại bê tông cuối cùng là gì - ví dụ, để sử dụng nó như kiểu trả về của một phương thức tạo ra một bản sao của đối tượng hiện tại.

Giả sử bạn muốn làm điều này - hãy để một lớp trừu tượng Abstract biết về loại bê tông triển khai nó. Bạn có thể bắt đầu bằng cách xác định một tham số kiểu, có lẽ như thế này:

trait Abstract[A] { 
    def copyObject: A = ... 
} 

Nhưng sau đó bạn nhận ra rằng trên thực tế, A phải là một lớp con của Abstract chính nó, như bạn không muốn lớp con để cung cấp một parametrization ngẫu nhiên. Vì vậy, bạn có thể thêm này:

trait Abstract[A <: Abstract] 

... nhưng bạn sẽ sớm nhận ra rằng Abstract đã trở thành một kiểu generic là tốt, vì vậy bạn sẽ khá cần điều này:

trait Abstract[A <: Abstract[A]] 

Là một bước cuối cùng, bạn có thể sẽ muốn chắc A hiệp biến nếu bạn có thể, để cho phép các lớp trừu tượng trung gian dọc theo con đường thừa kế từ Abstract đến lớp bê tông cuối cùng:

trait Abstract[+A <: Abstract[A]] 
class Concrete1 extends Abstract[Concrete1] 

trait RefinedAbstract[+A <: RefinedAbstract[A]] extends Abstract[A] 
class Concrete2 extends RefinedAbstract[Concrete2] 

Điều này có nghĩa rằng mọi loại không phải lá (trừu tượng) nên được parametrized, và rằng chỉ có lớp bê tông cuối cùng mới có thể loại bỏ tham số kiểu.

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