2015-03-30 15 views
5

Sau khi đi qua một vài ví dụ, tôi phải nói, tôi không hiểu những gì các F-Bounded đa hình mang lại.scala f-bounded loại giải thích

Để sử dụng ví dụ từ trường scala (https://twitter.github.io/scala_school/advanced-types.html#fbounded)

Họ giải thích rằng họ cần một số loại F-Bounded để các lớp con có thể trả lại subtype. Vì vậy, họ làm điều gì đó như thế này:

trait Container[A <: Container[A]] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(that: MyContainer) = 0 
} 

Nhưng tôi không thấy lợi ích của việc sử dụng loại này loại là những gì khi bạn có thể sử dụng một cái gì đó như thế này:

trait Container[A] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(other: MyContainer) = 0 
} 

Bất kỳ lời giải thích rất hoan nghênh

Cảm ơn

Trả lời

4

Ưu điểm sẽ đến khi nó trông giống như sau:

trait Container[A <: Container[A]] extends Ordered[A] { 
    def clone: A 
    def pair: (A, A) = (clone, clone) 
} 

class MyContainer extends Container[MyContainer] { 
    def clone = new MyContainer 
} 

Bây giờ bạn nhận được pair miễn phí và bạn nhận được loại trả lại chính xác. Nếu không có một cái gì đó như thế này bạn phải tự ghi đè lên tất cả các phương pháp duy nhất mà trả về cùng một loại (rất nhiều boilerplate vô nghĩa), hoặc bạn mất đặc trưng trong các loại của bạn ngay sau khi bạn gọi một phương pháp không ghi đè.

+1

Tôi nghĩ rằng tôi có điểm của Nishan và đối với tôi điều đó có ý nghĩa, nhưng phần bạn đang nói đến, là phần làm tôi bối rối. Từ ví dụ của bạn, bạn có thể định nghĩa A như thế: trait Container [A] và nhận được kết quả tương tự. Bạn sẽ không phải ghi đè lên chức năng cặp trong sublcass –

+0

Ồ, đừng bận tâm, tôi đã hiểu nó. Nếu bạn có đặc điểm Container [A], bạn không thể bảo đảm rằng từ trong lớp con, kiểu trả về A là loại Container. Cảm ơn rất nhiều –

1

Trong Scala, bạn có thể làm cho thông số loại của bạn bị ràng buộc bởi một loại bị ràng buộc. Ở đây trong phương pháp đầu tiên của bạn, bạn đang tạo tham số kiểu của bạn làm cho ràng buộc trên với lớp con của Container.

Bằng cách sử dụng phương thức thứ nhất, bạn không thể chuyển tham số trong lớp Container mà không phải là lớp con của lớp Container của bạn.

Trong ví dụ thứ 2, bạn có thể chuyển thể hiện loại tham số của bất kỳ lớp nào. Vì vậy, ở đây bạn không hạn chế bất cứ điều gì trong khi trong ví dụ đầu tiên bạn đang hạn chế loại phụ loại của lớp Container.