我與一些的Java API,這看起來有點像這個(這些都是Java類的,我就用Scala的語法簡潔集成:推斷類型參數
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
是第二個參數的唯一可能性......我想知道是否有一些我錯過的技巧,這將有可能「推斷」其他參數,只需指定一。
任何想法?
是的,這就是我最終做的事情......這很不幸,因爲創建生成器本身在現實中是相當乏味的,不僅僅是「新生成器」,因爲我在問題中簡化了它,而且我希望調用者能夠避免必須在任何地方進行。哦,好的... – Dima
看到編輯。它能解決你的問題嗎? –
是的,那是有效的...雖然不比'anyFoo [Foo,FooBarBuilder](foo,b)'短得多,但不像醜陋:) – Dima