2011-10-16 6 views
14

Chciałbym zdefiniować rodzajowy taki, że jego parametr typu NIE rozszerza danego typu.Parametr typu nie rozszerza się pod dany typ

Przykładowo

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

by określić cechy gdzie jego parametr typu rozciąga ratunkowym. Chcę czegoś takiego (nie rzeczywistego kodu Scala):

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

Gdzie parametr typu typ NIE rozciąga się na "Throwable". Czy istnieje sposób na skonstruowanie takiego pojęcia w Scali?

+3

Śmieszne, o które należy zapytać; Miles Sabin _just_ zamieścił odpowiedź na ten temat na liście języków scala pod wątkiem "Egzekwowanie, że funkcja zwraca coś (oprócz jednostki)": http://groups.google.com/group/scala-language/browse_thread/thread/e1242dfa7d65f599 –

Odpowiedz

21

Możesz zrobić coś takiego za pomocą implikacji. Oto sztuczka od Milesa Sinana na scala-language:

// 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

Jeśli już używasz biblioteki 'shapeless', to możesz zrobić:' def foo [T: | ¬ | [Jednostka] # λ] (t: T) = t' Lub, w dwóch liniach: 'type NotUnit [ T] = | ¬ | [Jednostka] # λ [T] 'i' foo [T: NotUnit] (t: T) = t' – VasyaNovikov

Powiązane problemy