Je l'intégration avec une api java, qui ressemble un peu comme ça (ce sont des classes java, je vais juste utiliser la syntaxe scala par souci de concision:paramètres type Inférer
class AbstractFooBuilder[ActualType <: AbstractFooBuilder, WhatToBuild <: Foo] {
// ...
def withFoo(f: Foo): ActualType
def withBar(b: Bar): ActualType
// ...
def build: WhatToBuild
}
class FooBarBuilder extends AbstractFooBuilder[FooBarBuilder, FooBar]
class FooBazBuilder extends AbstractFooBuilder[FooBazBuilder, FooBaz]
// .. etc
Il y a un tas de ceux-ci, et Je suis en train de faire de la création de ces foos moins répétitif avec quelque chose comme ceci:
def anyFoo[T <: Foo, B <: AbstractFooBuilder[B, T] : Manifest](foo: Foo, b: Bar) = manifest
.runtimeClass
.newInstance
.withFoo(foo)
.withBar(bar)
.build
le problème est que maintenant, pour créer FooBar
, je dois écrire quelque chose comme ceci:
val foobar = new anyFoo[FooBar, FooBarBuilder](foo, bar)
qui est plus long que je le voudrais. Plus précisément, une fois FooBarBuilder
paramètre de type est connu, FooBar
est la seule possibilité pour la deuxième ... Je me demande param s'il y a un truc qui me manque, qui permettrait de « déduire » l'autre param et ne doivent préciser un.
Des idées?
Ouais, c'est ce que je fini par faire ... Il est regrettable, parce que la création du constructeur lui-même est assez fastidieux dans la réalité, pas seulement 'nouveau Builder' comme je l'ai simplifié dans la question, et je voulais l'appelant de pouvoir éviter d'avoir à le faire partout. Oh bien ... – Dima
Voir la retouche. Cela résout-il votre problème? –
Ouais, ça marche ...bien que, pas beaucoup plus court, que 'anyFoo [Foo, FooBarBuilder] (foo, b)', mais pas aussi laid :) – Dima