2011-10-16 17 views
14

Me gustaría definir un genérico tal que su parámetro de tipo NO amplíe un tipo dado.El parámetro de tipo no se extiende tipo dado

Por ejemplo,

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

definiría un rasgo donde su parámetro de tipo extiende Throwable. Quiero algo como (código de Scala no real):

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

Donde el parámetro de tipo de tipo NO se extiende Throwable. ¿Hay alguna manera de construir tal noción en Scala?

+3

Gracioso que debes preguntar; Miles Sabin _solo_ publicó una respuesta a esto en la lista de idiomas en escala debajo del hilo "Imponer que la función devuelva algo (que no sea la Unidad)": http://groups.google.com/group/scala-language/browse_thread/thread/e1242dfa7d65f599 –

Respuesta

21

Puede hacer tal cosa utilizando implícitas. Aquí hay un truco de Miles Sabin en lenguaje scala:

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

Si ya usa la biblioteca 'sin forma', puede hacer:' def foo [T: | ¬ | [Unit] # λ] (t: T) = t' O, en dos líneas: 'type NotUnit [ T] = | ¬ | [Unidad] # λ [T] 'y' foo [T: NotUnit] (t: T) = t' – VasyaNovikov

Cuestiones relacionadas