パラメータ私は、これらはJavaクラスです、私は簡潔にするためScalaの構文を使用します(ちょっと、このようになりますように、いくつかのJava APIと統合しています:推測するタイプが
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
これらの束があり、そして私はこのような何かを持つこれらのFOOSの作成は以下の繰り返しにしようとしています:
def anyFoo[T <: Foo, B <: AbstractFooBuilder[B, T] : Manifest](foo: Foo, b: Bar) = manifest
.runtimeClass
.newInstance
.withFoo(foo)
.withBar(bar)
.build
問題は今、FooBar
を作成するために、私はこのような何かを書かなければならないということ、である:
val foobar = new anyFoo[FooBar, FooBarBuilder](foo, bar)
これは私が望むよりも長いです。具体的には、一度FooBarBuilder
型のパラメータがわかったら、FooBar
は2番目のパラメータの唯一の可能性です...私は欠けているトリックがあるかと思います。それは他のパラメータを "推測"できるようにします。 1。
アイデア?
ええ、それは私がやったことです...ビルダー自体を作成するのは現実には面倒です。私は質問でそれを簡略化しただけではなく、新しいビルダーです。私は呼び出し側がどこでもそれをする必要はありません。ああ... ... – Dima
編集を参照してください。あなたの問題を解決しますか? –
うん、それは動作します...'anyFoo [Foo、FooBarBuilder](foo、b)'よりもはるかに短くはありませんが、醜いものではありません:) – Dima