2012-03-07 15 views
14

Tengo dos objetos, ObjectA y ObjectB, ambos con un método update(). Quiero escribir una función que acepte ObjectA o ObjectB (pero no otros tipos). Conceptualmente, esto es lo que estoy tratando de hacer:aceptar múltiples tipos para un parámetro en scala

def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = { 
    obj.update 
} 

Sé que existen otras maneras de resolver este problema (por ejemplo, la tipificación estructural del método de actualización(), clase base común, etc.) pero mi pregunta es es posible hacerlo de esta manera en Scala y, de ser así, ¿cuál es la sintaxis? Y como se llama esto?

+0

¿Cómo se puede esperar que esto funcione? ¿Cómo sabría el compilador qué métodos tenía 'T' si no supiera de qué tipo era? Si quiere asegurarse de que su clase tenga una 'actualización', entonces para eso están los tipos estructurales. – dhg

+4

posible duplicado de [¿Scala tiene "disyunción tipo" (tipos de unión)?] (Http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types). Tanto la respuesta aceptada como la siguiente más calificada que refiere mi codificación de unión unboxed resuelven directamente esta pregunta. –

+0

@dhg, si tanto ObjectA como ObjectB tienen una actualización de método() y el tipo T extiende una u otra de esas clases, podría saber que el tipo T tiene un método update(). –

Respuesta

15

En Scala, existe el tipo Ya sea para hacer una unión disjunta. Básicamente, que va a hacer algo como:

def doSomething(obj: Either[ObjectA, ObjectB]) { 
    obj.fold(fa, fb) 
} 

Pedido http://www.scala-lang.org/api/current/scala/Either.html

+1

Si quieres tratarlos como uno, puedes usar un tipo estructural: 'obj.fold [{def update: Unit}] (identidad, identidad) .update' –

+1

No tengo idea de dónde vienen fa o fb en su ejemplo o por qué está llamando a fold() en obj, pero Oither parece ser la forma más cercana y limpia de hacer esto. Gracias. –

+0

@Bigwheels sería interrelacionarse para conocer el contexto de su problema porque podría estar equivocado, pero realmente no tiene sentido aplicar la misma función a los dos posibles objetos de una unión. Básicamente, fa y fb son cierres que aplicas en un ObjectA o un ObjectB. No los definí en mi ejemplo. Debes consultar el comentario de Miles Sabin sobre tu pregunta sobre los sindicatos. Sin embargo, es un tipo bastante técnico de pirateo. – blouerat

Cuestiones relacionadas