2012-06-17 19 views
6

Se puede decir un parámetro de tipo T debe tener un supertipo S_1 específica:¿Cómo decir que un parámetro de tipo debe tener un supertipo de supertipos alternativos?

class Test[T <: S_1] 

¿Hay una manera de decir, que un parámetro de tipo debe tener al menos un supertipo de múltiples alternativas supertipo? Algo así como (pseudocódigo):

class Test[T <: S_1 || S_2] 

O: esto no es posible, ya que tal construcción no tiene sentido y sería un indicio de un error de diseño en el código?

+0

¿Puede dar un ejemplo de cómo se podría utilizar? ¿Estás pensando en un caso en el que los objetos de tipo parámetro 'T' solo usarán un método que tenga la misma firma en los tipos no relacionados' S_1' y 'S_2'? –

+4

Lo que estás buscando es un * tipo de unión *; vea esta pregunta: http://stackoverflow.com/q/3508077/770361 –

Respuesta

9

Respuesta corta: La solución intuitiva es hacer S_1 y S_2 comparten un rasgo común que representa el conjunto de habilidades que se requieren para el parámetro de tipo T. Use ese rasgo como el límite superior para T.

Más posibilidades:

  • Si S_1 y S_2 son de una naturaleza o su requisito para el tipo T es que tiene ciertos miembros (que tanto S_1 y S_2 suceda a aplicar), se puede utilizar una structural type para formular eso (el concepto detrás se llama duck typing).

  • Si por alguna razón usted realmente necesita T ser una subclase de S_1 o S_2, y no se puede cambiar esos tipos, se puede utilizar para convertir implícitos ambos a una reciente introducción de tipo interno S_1_or_2, que se puede usar como un límite superior para su T.

3

Permítanme ampliar Niklas segundo alternativo. Los parámetros implícitos se pueden usar para probar algo sobre el tipo, por lo que esto parece justo lo que necesita. Sería así:

class ThingIWantToProve[T] 
object ThingIWantToProve { 
    // Here I define the proofs I need 
    implicit def s1IsProvable: ThingIWantToProve[S_1] = new ThingIWantToProve[S_1] 
    implicit def s2IsProvable: ThingIWantToProve[S_2] = new ThingIWantToProve[S_2] 
} 
class Test[T : ThingIWantToProve] // here I use a context bound 
Cuestiones relacionadas