2011-10-16 25 views
14

型パラメータが与えられた型を拡張しないようにgenericを定義したいと思います。例えば型パラメータが与えられた型を継承しない

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

は、そのタイプパラメータがのThrowableを拡張形質を定義します。私はスカラーコードではないものを望んでいます:

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

ここで、型パラメーターはThrowableを拡張しません。 Scalaでそのような概念を構築する方法はありますか?

+3

面白いです。 Miles Sabin _just_は、「関数がユニット以外のものを返すようにする」というスレッドの下のスカラ言語リストに、これに対する答えを投稿しました:http://groups.google.com/group/scala-language/browse_thread/thread/e1242dfa7d65f599 –

答えて

21

このようなことは、暗黙的に行うことができます。ここでは、スカラ言語でMiles Sabinからのトリックがあります:

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

もし 'shapeless'ライブラリを既に使用しているなら、' def foo [T:|¬| [Unit]#λ](t:T)= t'または2行で 'type NotUnit [ T] = |¬| [ユニット]#λ[T] 'と' foo [T:NotUnit](t:T)= t' – VasyaNovikov

関連する問題