2013-04-23 1 views
1

Est-il possible d'avoir une restriction sur deux types non liés dans Scala? Par exemple,Type lié pour deux types non liés

trait A 
trait B 
def m(T <: A or B) ???? 

Merci

+2

Vous pouvez le contourner http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types –

Répondre

1

Si votre A et B est totalement indépendant (par exemple, pas de méthode commune que vous avez besoin, sinon vous pourriez simplement utiliser type de structure), cela signifie que lorsque vous l'utilisez En tant que paramètre de méthode, vous avez toujours besoin de quel type il est réellement pour les utiliser.

Dans ce cas, Either[A, B] est exactement ce dont vous avez besoin. Il indique qu'un objet doit être un de A ou B, et vous pouvez utiliser la correspondance de modèle ou une autre méthode dans la classe Sither pour les vérifier.

Par exemple:

class MyClassA { 
    def methodA() = println("I'm A") 
} 

class MyClassB { 
    def methodB() = println("I'm B") 
} 

def m(a: Either[MyClassA, MyClassB]) { 
    a match { 
    case Left(a) => a.methodA() 
    case Right(b) => b.methodB() 
    } 
} 

m(Left(new MyClassA)) // OK 
m(Right(new MyClassB)) // OK 
m(Left(new MyClassB)) // Failed, a Left must be a MyClassB instance 

Vous pouvez intéressé par cet article, ce qui explique ce qui est soit très clairement.

+0

Point secondaire; la dernière ligne est la même que la troisième dernière ligne - vous vouliez peut-être dire m (Left (new MyClassB)) 'ou' m (Right (new MyClassA)) '. Aussi, pour plus de concision, dans le corps de 'm', vous pouvez utiliser' a.fold (a => a.methodA(), b => b.methodB()) ', ou même' a.fold (_. methodA(), _.methodB()) ' –

+0

@KristianDomagala ya, j'ai une faute de frappe là-bas. Merci. :) –

+0

Voir [cette réponse] (http://stackoverflow.com/a/6312508/217959) sur la question liée à @ om-nom-nom. Miles Sabin a un [post de blog] (http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/) montrant des types d'union * unboxed * - ce qui laisse tomber l'enveloppe Sither objet entièrement. – nadavwr

Questions connexes