2011-10-16 33 views
14

Tôi muốn xác định một kiểu chung để tham số kiểu của nó KHÔNG mở rộng một kiểu nhất định.Thông số kiểu không mở rộng loại được cho là

Ví dụ,

trait myTrait[T <: Throwable] { 
    // .... 
} 

sẽ xác định một đặc điểm nơi tham số kiểu của nó kéo dài Throwable. Tôi muốn một cái gì đó như (không phải mã Scala thực):

trait myTrait[T Not(<:) Throwable] { 
    // .... 
} 

Trường hợp thông số loại loại KHÔNG mở rộng Có thể ném. Có cách nào để xây dựng một khái niệm như vậy trong Scala không?

+3

Vui lòng bạn nên hỏi; Miles Sabin _just_ đã đăng một câu trả lời cho điều này trong danh sách ngôn ngữ scala theo chủ đề "Giả sử rằng hàm trả về một cái gì đó (không phải là Đơn vị)": http://groups.google.com/group/scala-language/browse_thread/thread/e1242dfa7d65f599 –

Trả lời

21

Bạn có thể thực hiện một điều như vậy bằng cách sử dụng các thuật ngữ. Đây là mẹo của Miles Sabin về ngôn ngữ địa chỉ:

// Encoding for "A is not a subtype of B" 
trait <:!<[A, B] 

// Uses ambiguity to rule out the cases we're trying to exclude 
implicit def nsub[A, B] : A <:!< B = null 
implicit def nsubAmbig1[A, B >: A] : A <:!< B = null 
implicit def nsubAmbig2[A, B >: A] : A <:!< B = null 

// Type alias for context bound 
type NOT[T] = { 
type Lambda[U] = U <:!< T 
} 

// foo does not accept T of type Unit 
def foo[T : NOT[Unit]#Lambda](t : T) = t 
+0

Nếu bạn đã sử dụng thư viện 'shapeless' thì bạn có thể làm:' def foo [T: | ¬ | [Unit] # λ] (t: T) = t' Hoặc, trong hai dòng: 'type NotUnit [ T] = | ¬ | [Đơn vị] # λ [T] 'và' foo [T: NotUnit] (t: T) = t' – VasyaNovikov

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