2012-03-07 1 views
14

J'ai deux objets, ObjectA et ObjectB, les deux avec une méthode update(). Je veux écrire une fonction qui accepte ObjectA ou ObjectB (mais pas d'autres types). , C'est conceptuellement ce que je suis en train de faire:accepter plusieurs types pour un paramètre dans scala

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

Je sais qu'il ya d'autres façons de résoudre ce problème (par exemple, la saisie structurelle de la méthode mise à jour(), classe de base commune, etc.), mais ma question est il est possible de le faire de cette façon dans Scala et si oui, quelle est la syntaxe? Et comment s'appelle-t-il?

+0

Comment pensez-vous que cela fonctionne? Comment le compilateur pouvait-il savoir quelles étaient les méthodes 'T' s'il ne savait pas de quel type il s'agissait? Si vous voulez vous assurer que votre classe a une «mise à jour», alors c'est ce que les types structurels sont pour. – dhg

+4

duplication possible de [Est-ce que Scala a "type disjunction" (types d'union)?] (Http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types). A la fois la réponse acceptée et la suivante la plus haute référence renvoyant mon codage d'union sans boîte résout directement cette question. –

+0

@dhg, si ObjectA et ObjectB ont une méthode update() et que le type T étend l'une ou l'autre de ces classes, il peut savoir que le type T a une méthode update(). –

Répondre

15

En Scala, il existe le type Soit faire une union disjointe. Fondamentalement, vous allez faire quelque chose comme:

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

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

+1

Si vous voulez les traiter comme un, vous pouvez en outre utiliser un type structurel: 'obj.fold [{def update: Unit}] (identité, identité) .update' –

+1

Je n'ai aucune idée d'où proviennent fa ou fb votre exemple ou pourquoi vous appelez fold() sur obj, mais Soit semble être la façon la plus proche et la plus propre de le faire. Merci. –

+0

@Bigwheels il serait intéressant de connaître le contexte de votre problème parce que je peux me tromper, mais il ne fait pas vraiment sens d'appliquer la même fonction aux deux objets possibles d'une union. Fondamentalement, fa et fb sont des fermetures que vous appllez sur un ObjectA ou un ObjectB. Je ne les ai pas définis dans mon exemple. Vous devriez vérifier les commentaires de Miles Sabin sur votre question sur les syndicats sans Sither, c'est plutôt un type de piratage technique. – blouerat

Questions connexes