2017-02-20 68 views
1

我有一對夫婦實現的接口:爲什麼Guice沒有找到我的清單<Interface>的綁定?

interface PuNoManager { 
    fun notifyUser(userId: Int) 
} 

class FcmManager 
@Inject 
constructor(val fcmClient: FcmClient) : PuNoManager { 
    override fun notifyUser(userId: Int) { ... } 
} 

class ApnsManager 
@Inject 
constructor(val apnsClient: ApnsClient) : PuNoManager { 
    override fun notifyUser(userId: Int) { ... } 
} 

這是在我的Module既束縛,用@Provides -annotated方法一起獲得List<PuNoManager>

class PuNoModule: AbstractModule() { 
    override fun configure() { 
     bind(ApnsManager::class.java) 
     bind(FcmManager::class.java) 
    } 

    @Provides 
    fun puNoManagers(apnsManager: ApnsManager, fcmManager: FcmManager): List<PuNoManager> { 
     return listOf(apnsManager, fcmManager) 
    } 
} 

問題出現當我有一個類需要List<PuNoManager> -Guice抱怨該類型未被綁定:

Explicit bindings are required and java.util.List<? extends ...PuNoManager> is not explicitly bound. 
    while locating java.util.List<? extends ...PuNoManager> 

我知道我的Guice設置正在工作,因爲我之前只有ApnsManager並且正在添加第二個PuNoManager,FcmManager。問題源於請求注射List<PuNoManager>的相關類別,而不僅僅是ApnsManager

+1

嘗試'@JvmSuppressWildcards列表'或'MutableList ' –

+0

大的解決方法的想法,註釋沒有工作,但改變構造函數的請求一個'MutableList '得到了注射正常工作。當我在'@ Provide'方法中調出調試器時,'listOf()'創建一個'ArrayList',這確實是一個可變列表。 –

+0

我認爲註釋應該是'List <@JvmSuppressWildcards PuNoManager>'? –

回答

1

List<X> Kotlin在JVM上翻譯爲java.util.List<? extends X>。顯然,Guice不支持注入這些值。爲了避免這裏的通配符,您可以使用MutableList<X>代替,轉化爲java.util.List<X>

相關問題