2010-01-18 2 views
0

J'ai une méthode d'assistance:Scala méthode abstraite question param, Liste des T

def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => T) = { 
    try { 
     val tempObject = body 
     tempObject.callSomeMethod 
     Some(tempObject) 
    } catch { 
     case e if (exceptions.contains(e.getClass)) => None 
    } 
} 

appelé avec:

controlStructure[MySomeObject](classOf[Exception]) { getMySomeObjectSomehow } 

le point principal qui est d'appeler le 'callSomeMethod' sur l'entité transmis (par exemple chargé à partir de ORM), il encapsule également des choses dans la gestion des exceptions aussi.

Je voudrais maintenant ajouter une nouvelle méthode qui fait la même chose, mais pour une collection (java.util.List) de T.

Je ne suis pas sûr de la syntaxe et des structures pour travailler avec une collection de T dans la signature de méthode, et les définitions de paramètres de type abstrait.

Merci pour votre aide.

+0

Veuillez modifier votre question pour utiliser des blocs de code pour vos exemples de code. C'est très difficile à lire tel quel. –

Répondre

0

Il n'y a pas de passage par le nom vararg dans Scala. Vous devez passer une fonction si vous le souhaitez. Voir this ticket d'une demande d'amélioration à cet effet.

1

Avec une liste de scala, vous manquez quelque chose comme ça (je pense):

def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => List[T]) = { 
    try { 
     val tempObject = body 
     tempObject.foreach { _.callSomeMethod() } 
     Some(tempObject) 
    } 
    catch { 
     case e if (exceptions.contains(e.getClass)) => None 
    } 
    } 

Je n'ai pas travaillé avec des listes Java dans scala, donc je devine que vous pouvez le faire avec java. util.Liste comme ceci:

def controlStructure[T <: SomeObject](exceptions: Class[_]*)(body: => java.util.List[T]) = { 
    import scala.collection.JavaConversions._ 
    try { 
     val tempObject = body 
     tempObject foreach { _.callSomeMethod() } 
     Some(tempObject) 
    } 
    catch { 
     case e if (exceptions.contains(e.getClass)) => None 
    } 
    } 
+0

Bonjour, merci pour votre aide. Désolé j'ai oublié de mentionner, j'utilise Scala 2.8.0-Beta1-RC2, donc je supposais que je pouvais simplement appeler 'foreach' sur tempObject sans avoir besoin de la substance .toArray en important 'scala.collection.JavaConversions. _ ', cependant il me dit trouvé: java.lang.Object requis: java.util.List [MySomeObject] Des idées? – user549213

+0

Modifié pour utiliser JavaConversions et fonctionne comme indiqué pour moi (en utilisant Scala 2.8.0.r19890). Pouvez-vous confirmer vos correspondances de code? –

+0

Bonjour. Mon importation JavaConversions est en haut du fichier, et je passe un java.util.ArrayList [MySomeObject] avec un élément dans la construction controlStructure. La seule autre différence que je peux penser est que mon SomeObject fait partie de ma couche de domaine, et donc hérite de divers traits? – user549213

0

Merci pour votre aide Mitch. Il s'avère que la réponse est dans ce cas pour spécifier le type de retour de la méthode, comme java.util.List [T], comme pour une fois que Scala n'utilise pas son inférence de type magique pour tout trier.

Questions connexes