2013-07-11 35 views
5

Khi thực hiện một cấu trúc dữ liệu sắp xếp được, tôi đã nghĩ đến việc làm một cái gì đó như thế này:Loại tham số T giáp đặt hàng [T]

trait MaxHeap[T <: Ordering[T]] { 
    def insert(e: T): Unit 
    ... 
} 

Nhưng điều đó sẽ không làm việc với nhiều loại như MaxHeap [Int]. Trong thư viện bộ sưu tập tiêu chuẩn, loại phần tử T của tập hợp không bị chặn. Thay vào đó, một ngầm định được cung cấp cho các phương thức cần nó để chuyển đổi T thành Đặt hàng [T], ví dụ:

trait Seq[+A] extends ... { 
    // it's Ordering[B], not Ordering[A], but the idea is the same. 
    def max[B >: A](implicit cmp: Ordering[B]): A 
} 

Câu hỏi của tôi là, nếu có nhiều phương pháp trong lớp học của tôi/đặc điểm liên quan đến so sánh, có cách nào để xác định loại nguyên tố lớp/đặc điểm để có thể so sánh được vì vậy mà tôi không cần phải khai báo implicits cho những phương pháp?

Trả lời

5

Bạn có thể khai báo một tham số ngầm định nghĩa thứ tự, và sau đó bạn có thể sử dụng nó trong tất cả các phương pháp của bạn:

class MaxHeap[T](implicit cmp: Ordering[_ >: T]) ... 

Nếu đó là một đặc điểm, nó không thể lấy một tham số, nhưng bạn có thể khai báo nó như một giá trị tiềm ẩn:

trait Heap[T] { 
    implicit protected val cmp: Ordering[_ >: T]; 
    // ... use cmp in your methods ... 
} 

và sau đó mỗi lớp có sử dụng nó có thể mất một tham số ngầm đó sẽ ghi đè nó:

class MaxHeap[T](implicit override protected val cmp: Ordering[_ >: T]) 
    extends Heap[T] 
{ 
    // ... 
} 

Cập nhật: Đối với một số technical reasonsOrdering không contravariant. Đây là lý do tại sao tôi sử dụng Ordering[_ >: T], bởi vì nó cho phép sự linh hoạt hơn. Bạn có thể sử dụng thứ tự được xác định cho một siêu lớp của T. Bạn có thể sử dụng tất nhiên chỉ cmp: Ordering[T], nhưng sau đó bạn không thể làm những việc như

new MaxHeap[java.lang.Integer]()(new Ordering[java.lang.Number] { 
    // ... 
    }); 

Ngoài ra, toàn bộ ý tưởng của Ordering là bạn không cần phải áp đặt bất kỳ hạn chế về T. Điều này linh hoạt hơn và trong số những thứ khác cho phép có sự so sánh khác nhau cho cùng một lớp.

+0

Cảm ơn bạn @Petr. Nhưng theo cách này, 'T' không được thi hành để có thể so sánh được như thể nó đã được giới hạn trong danh sách tham số kiểu. Bất kỳ 'T' sẽ làm, cung cấp một tiềm ẩn được đưa ra. – cfchou

+0

'Đặt hàng [_>: T]' là một kỹ thuật mà tôi chưa từng thấy trước đây. Nhưng tôi tự hỏi tại sao không sử dụng 'Ordering [T]'. Các toán tử thuận tiện như '>' được cung cấp gián tiếp bởi 'Ordering.Implicits' dường như không hoạt động với' Ordering [_>: T] '. – cfchou

+0

@cfchou Tôi cập nhật câu trả lời để giải quyết các nhận xét của bạn. –

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