9
votes

Existe-t-il un moyen de spécifier un sous-ensemble de paramètres de type dans Scala, en inférant le reste?

J'ai une classe qui ressemble à ceci:

val x = new X[AssertionError](3, 4)
val x = new X[AssertionError, _, _](3, 4)
val x = new X[AssertionError,,](3, 4)


0 commentaires

5 Réponses :



3
votes

Vous pouvez définir un alias de type où votre premier paramètre de type est fixé à assertionError : xxx


4 commentaires

+1. C'est cool, mais si je spécifie un type d'exception différent à chaque point d'utilisation, c'est un peu verbeux.


C'est à peu près ce que j'ai suggéré, ajouter un commentaire au lieu d'une solution séparée aurait été un geste gentil. Va supprimer ma réponse pour plus de clarté ...


@ bluenote10 Vous avez suggéré une sous-classe qui est plus poids lourdement (existe au moment de l'exécution). La solution de type alias est notamment plus propre (est résolue au moment de la compilation)


Je suis totalement avec vous là-bas (bien qu'il puisse y avoir des cas où le sous-classement pourrait être souhaitable?). C'est pourquoi j'ai supprimé ma réponse. Mais ce n'est rien qui ne peut être résolu par un édition / commentaire ...



5
votes

Mon principale préoccupation était de rendre cela facile au point d'utilisation (je préférerais ne pas avoir à définir de nouveaux types pour chaque utilisation, car les types d'exception sont souvent différents). J'ai constaté que je peux utiliser l'objet compagnon vers l'usine une usine intermédiaire: xxx

Le seul inconvénient que je peux voir, c'est que vous devez épeler "Appliquer".


0 commentaires

4
votes

Voici ma solution:

scala> class X[A <: Throwable, B, C](b: B, c: C)
defined class X

scala> class Builder[A <: Throwable] {
     |   def apply[B, C](b: B, c: C) = new X[A,B,C](b,c)
     | }
defined class Builder

scala> def X[A <: Throwable]: Builder[A] = new Builder[A]
X: [A <: Throwable]=> Builder[A]

scala> val x = X[AssertionError](3, 4)
x: X[AssertionError,Int,Int] = X@2fc709


0 commentaires

1
votes

Vous pouvez simplement définir un constructeur avec un argument par défaut.

scala> class X[A <: Throwable, B, C](b: B, c: C, clz:Class[_ <: A] = classOf[Nothing])
defined class X

scala> new X(1,2)
res0: X[Nothing,Int,Int] = X@16de4e1

scala> new X(1,2, classOf[AssertionError])
res1: X[AssertionError,Int,Int] = X@1e41869


0 commentaires