2016-05-23 29 views
0

使用泛型我下面用com.google.inject.multibindings.Multibinder時是仿製藥有點困惑:在Multibinder

interface MessageParser<S, T> { 
    fun accept(msg: S): Boolean 
    fun parser(msg: S): T 
} 
class Parser1 : MessageParser<Mime, Parsed> 
class Parser2 : MessageParser<Mime, Parsed> 

class EmailModule : AbstractModule() { 
    override fun configure() { 
     val parsers = Multibinder.newSetBinder(binder(), MessageParser::class.java) 
     parsers.addBinding().to(Parser1::class.java) 
     parsers.addBinding().to(Parser2::class.java) 
    } 
} 

這工作,但失去所有的仿製藥信息。是否有可能限制這解析器的特定子集,即做

val parsers: MessageParser<Mime, Parsed> = 
    Multibinder.newSetBinder(binder(), MessageParser<Mime, Parsed>::class.java) 

眼下,這會產生一個編譯器錯誤:

Only classes are allowed on the left hand side of a class literal

回答

1

使用TypeLiteral,而不是一類的文字注入類與一般類型(https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-to-inject-class-with-generic-type)。有關Java示例,請參見Multibinding with generics。以下是相當於Kotlin的例子。

val parsers = Multibinder.newSetBinder(binder(), object : TypeLiteral<MessageParser<Mime, Parsed>>() {}) 
+0

我知道這不是問題的一部分,但是你會知道爲什麼這個映射不能用在同一個模塊的'@Proced'方法中嗎?否則,按照廣告宣傳,接受。 – mabi