2013-04-01 37 views
9

Tôi đang đọc Programming Scala ngay bây giờ. Tôi vừa xem qua chương về chuyển đổi kiểu ngầm, trong đó biểu tượng <% được giới thiệu. Ngoài ra còn có biểu tượng <: và biểu tượng <.Scala Generics Type Constraints

Ai đó có thể tóm tắt các loại ràng buộc khác nhau không? Tôi đang đấu tranh với sự khác biệt giữa <:< chẳng hạn. Tôi tò mò nếu có bất kỳ người nào khác mà tôi chưa đề cập đến.

+0

Bản sao có thể có của http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds cũng xem http://stackoverflow.com/questions/3427345/what-do-and -mean-in-scala-2-8-và-nơi-được-họ-tài liệu –

+0

@ om-nom-nom Tôi không quan tâm đến các nhà khai thác địa chỉ trong bài viết bạn liệt kê. Tôi quan tâm đến toán tử ràng buộc loại: '<:', '<%', '>:', v.v. Chúng hoàn toàn không liên quan. –

Trả lời

16

Không có ràng buộc loại nào được gọi là <.

A <: B nghĩa A là nghĩa đen một subtype của B (nơi kiểu phụ được xác định theo phản xạ, có nghĩa là cho bất kỳ loại T nó là trường hợp đó T <: T).

A <% B nghĩa A hoặc là một subtype của B hoặc có một chuyển đổi ngầm từ A cho một loại biệt AAAA <: B. Điều này được gọi là "chế độ xem bị ràng buộc".

A >: B có nghĩa là A là siêu kiểu B.

+0

Bạn nói đúng, không có ràng buộc '<'. Điều gì về ràng buộc '>:'? –

+0

Tôi mới bắt đầu đọc chương về triển khai 'Danh sách'. Nó giải thích rằng '>:' có thể được sử dụng để tạo ra một 'List [Fruit]' khi thêm một 'Orange' vào một' List [Apple] '. Đó là một hạn chế rất thú vị. –

+0

Chính xác hơn: A <% B có nghĩa là có chuyển đổi ẩn từ A thành loại AA riêng biệt mà AA <: B. Nếu A là loại phụ của B, AA có thể giống A: Danh tính chức năng (được định nghĩa trong Predef và luôn trong phạm vi) có thể được áp dụng thay vì một chuyển đổi thực tế. Nhưng ngay cả khi A là một kiểu con của B, có thể có chuyển đổi ẩn đối với loại AA khác được ưu tiên hơn Predef.identity(). Trong trường hợp đó, trình biên dịch sẽ suy ra loại AA. Phụ thuộc vào quyền ưu tiên của implicits. –

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