Nó không ẩn tạo kiểu. Về cơ bản nó mặt nạ sử dụng sự phản chiếu để kiểm tra các ràng buộc cấu trúc của bạn tại thời gian biên dịch và để gọi someMethod khi chạy.
Ví dụ, nếu bạn có:
class Foo(t: MyClass {def someMethod:String}) {
def CallSomeMethod = t.someMethod
}
điều này có nghĩa các nhà xây dựng cho lớp Foo của bạn chấp nhận một t kiểu MyClass rằng cũng có một someMethod (nơi someMethod có thể được trộn vào MyClass qua một đặc điểm). Bạn có thể có:
class MyClass {}
trait WithSomeMethod {def someMethod = "hello"}
và sau đó bạn có thể tạo Foo như thế này:
val mc = new MyClass with WithSomeMethod
val foo = new Foo(mc)
println(foo.CallSomeMethod) // prints "hello"
bây giờ, khi bạn tạo new Foo(mc)
trình biên dịch sử dụng phản xạ để kiểm tra mc đó là một MyClass rằng cũng có một someMethod . Các cuộc gọi thực tế foo.CallSomeMethod
hoạt động thông qua sự phản ánh là tốt.
Bây giờ (chịu với tôi, tôi nhận được cho câu hỏi thực tế của bạn ...) làm như bạn đã làm:
type T = MyClass {def someMethod:String}
chỉ đang tạo ra một bí danh loại, không phải là một kiểu dữ liệu cụ. Khi bạn đã xác định T theo cách đó, bạn có thể xác định Foo là:
class Foo(t: T) {
def CallSomeMethod = t.someMethod
}
điều này tương đương với định nghĩa của Foo đã cho trước đó. Bạn vừa tạo một bí danh T có thể được sử dụng lại ở những nơi khác mà bạn có thể đã sử dụng MyClass {def someMethod:String}
. Không có kiểu T thực tế nào được tạo ra và trình biên dịch vẫn sử dụng sự phản chiếu bất cứ khi nào bạn tham chiếu đến T, để kiểm tra ràng buộc cấu trúc mà nó có định nghĩa someMethod và vẫn tạo mã dựa trên sự phản chiếu để gọi someMethod.
Nguồn
2011-08-31 15:05:53
Cảm ơn, vì vậy việc sử dụng hạn chế về cấu trúc như chậm như phản ánh trong java? Và đặc điểm là lựa chọn tốt hơn trong những ánh sáng đó. – yura
có, các loại kết cấu có tác động hiệu suất do phản ánh. –