Dagger/DuplicateBindings 具有通用接口,即使在使用限定符注解时也是如此
Dagger/DuplicateBindings with generic interfaces even when using qualifier annotation
我有一个这样定义的基本接口:
@JvmSuppressWildcards
abstract class IWorkerContract<T, R>(
private val mContext: Context,
// Some other stuff
) {
private val ctx: CoroutineScope = CoroutineScope(Job())
// Some other stuff
}
现在,我有两个 类 实现了这个接口
class ShopItemProductDescWorkerContract @Inject constructor(
// Some other stuff
) : IWorkerContract<@JvmSuppressWildcards List<ShopItemDescription>,@JvmSuppressWildcards String>( // important part
// Some other stuff
){
class ShopItemTechnicalDescWorkerContract @Inject constructor(
// Some other stuff
) : IWorkerContract<@JvmSuppressWildcards List<ShopItemDescription>,@JvmSuppressWildcards String>(
// Some other stuff
){
最后,在我的模块中
@Module
@InstallIn(ViewModelComponent::class)
abstract class WorkerModule {
@WorkerContract(EWorkerContracts.SHOP_ITEM_PROD)
@Binds
abstract fun bindShopItemProductDescWorkContract(sipContract: ShopItemProductDescWorkerContract): IWorkerContract<List<ShopItemDescription>, String>
@WorkerContract(EWorkerContracts.SHOP_ITEM_TECH)
@Binds
abstract fun bindShopItemTechnicalDescWorkContract(sitContract: ShopItemTechnicalDescWorkerContract): IWorkerContract<List<ShopItemDescription>, String>
}
@Retention(AnnotationRetention.RUNTIME)
annotation class WorkerContract(val value: EWorkerContracts)
enum class EWorkerContracts {
SHOP_ITEM_PROD,
SHOP_ITEM_TECH
}
错误
error: [Dagger/DuplicateBindings] com.example.app.business.datasource.network.worker.list.IWorkerContract<java.util.List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,java.lang.String> is bound multiple times:
public abstract static class SingletonC implements App_GeneratedInjector,
^
@org.jetbrains.annotations.NotNull @Binds @com.example.app.di.business.network.WorkerContract(com.example.app.di.business.network.EWorkerContracts.SHOP_ITEM_PROD) com.example.app.business.datasource.network.worker.list.IWorkerContract<List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,String> com.example.app.di.business.network.WorkerModule.bindShopItemProductDescWorkContract(com.example.app.business.datasource.network.worker.shop.item.productdesc.ShopItemProductDescWorkerContract)
@org.jetbrains.annotations.NotNull @Binds @com.example.app.di.business.network.WorkerContract(com.example.app.di.business.network.EWorkerContracts.SHOP_ITEM_TECH) com.example.app.business.datasource.network.worker.list.IWorkerContract<List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,String> com.example.app.di.business.network.WorkerModule.bindShopItemTechnicalDescWorkContract(com.example.app.business.datasource.network.worker.shop.item.technicaldesc.ShopItemTechnicalDescWorkerContract)
com.example.app.business.datasource.network.worker.list.IWorkerContract<java.util.List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,java.lang.String> is injected at
com.example.app.business.interactor.shop.item.ShopItemInteractor(shopItemProductWorkerContract, �)
com.example.app.business.interactor.shop.item.ShopItemInteractor is injected at
com.example.app.presentation.shop.item.core.ShopItemViewModel(shopItemInteractor, �)
com.example.app.presentation.shop.item.core.ShopItemViewModel is injected at
com.example.app.presentation.shop.item.core.ShopItemViewModel_HiltModules.BindsModule.binds(vm)
@dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.example.app.presentation.App_HiltComponents.SingletonC ? com.example.app.presentation.App_HiltComponents.ActivityRetainedC ? com.example.app.presentation.App_HiltComponents.ViewModelC]
It is also requested at:
com.example.app.business.interactor.shop.item.ShopItemInteractor(�, shopItemTechnicalWorkerContract, �)
您没有在示例中使用 @Named
,而是将 @WorkerContract
用作 qualifier annotation。 (@Named
是一个内置的限定符注释,但您可以像示例中那样创建自己的注释。)
但是,您缺少 @Qualifier
元注释本身:
Identifies qualifier annotations. Anyone can define a new qualifier. A qualifier annotation:
- is annotated with
@Qualifier
, @Retention(RUNTIME)
, and typically @Documented
.
- [...]
作为 @Documented
is optional and only affects the Javadoc,请务必添加 @Qualifier
,这样你就可以开始了。
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class WorkerContract(val value: EWorkerContracts)
我有一个这样定义的基本接口:
@JvmSuppressWildcards
abstract class IWorkerContract<T, R>(
private val mContext: Context,
// Some other stuff
) {
private val ctx: CoroutineScope = CoroutineScope(Job())
// Some other stuff
}
现在,我有两个 类 实现了这个接口
class ShopItemProductDescWorkerContract @Inject constructor(
// Some other stuff
) : IWorkerContract<@JvmSuppressWildcards List<ShopItemDescription>,@JvmSuppressWildcards String>( // important part
// Some other stuff
){
class ShopItemTechnicalDescWorkerContract @Inject constructor(
// Some other stuff
) : IWorkerContract<@JvmSuppressWildcards List<ShopItemDescription>,@JvmSuppressWildcards String>(
// Some other stuff
){
最后,在我的模块中
@Module
@InstallIn(ViewModelComponent::class)
abstract class WorkerModule {
@WorkerContract(EWorkerContracts.SHOP_ITEM_PROD)
@Binds
abstract fun bindShopItemProductDescWorkContract(sipContract: ShopItemProductDescWorkerContract): IWorkerContract<List<ShopItemDescription>, String>
@WorkerContract(EWorkerContracts.SHOP_ITEM_TECH)
@Binds
abstract fun bindShopItemTechnicalDescWorkContract(sitContract: ShopItemTechnicalDescWorkerContract): IWorkerContract<List<ShopItemDescription>, String>
}
@Retention(AnnotationRetention.RUNTIME)
annotation class WorkerContract(val value: EWorkerContracts)
enum class EWorkerContracts {
SHOP_ITEM_PROD,
SHOP_ITEM_TECH
}
错误
error: [Dagger/DuplicateBindings] com.example.app.business.datasource.network.worker.list.IWorkerContract<java.util.List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,java.lang.String> is bound multiple times:
public abstract static class SingletonC implements App_GeneratedInjector,
^
@org.jetbrains.annotations.NotNull @Binds @com.example.app.di.business.network.WorkerContract(com.example.app.di.business.network.EWorkerContracts.SHOP_ITEM_PROD) com.example.app.business.datasource.network.worker.list.IWorkerContract<List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,String> com.example.app.di.business.network.WorkerModule.bindShopItemProductDescWorkContract(com.example.app.business.datasource.network.worker.shop.item.productdesc.ShopItemProductDescWorkerContract)
@org.jetbrains.annotations.NotNull @Binds @com.example.app.di.business.network.WorkerContract(com.example.app.di.business.network.EWorkerContracts.SHOP_ITEM_TECH) com.example.app.business.datasource.network.worker.list.IWorkerContract<List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,String> com.example.app.di.business.network.WorkerModule.bindShopItemTechnicalDescWorkContract(com.example.app.business.datasource.network.worker.shop.item.technicaldesc.ShopItemTechnicalDescWorkerContract)
com.example.app.business.datasource.network.worker.list.IWorkerContract<java.util.List<com.example.app.business.domain.model.shop.item.ShopItemDescription>,java.lang.String> is injected at
com.example.app.business.interactor.shop.item.ShopItemInteractor(shopItemProductWorkerContract, �)
com.example.app.business.interactor.shop.item.ShopItemInteractor is injected at
com.example.app.presentation.shop.item.core.ShopItemViewModel(shopItemInteractor, �)
com.example.app.presentation.shop.item.core.ShopItemViewModel is injected at
com.example.app.presentation.shop.item.core.ShopItemViewModel_HiltModules.BindsModule.binds(vm)
@dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.example.app.presentation.App_HiltComponents.SingletonC ? com.example.app.presentation.App_HiltComponents.ActivityRetainedC ? com.example.app.presentation.App_HiltComponents.ViewModelC]
It is also requested at:
com.example.app.business.interactor.shop.item.ShopItemInteractor(�, shopItemTechnicalWorkerContract, �)
您没有在示例中使用 @Named
,而是将 @WorkerContract
用作 qualifier annotation。 (@Named
是一个内置的限定符注释,但您可以像示例中那样创建自己的注释。)
但是,您缺少 @Qualifier
元注释本身:
Identifies qualifier annotations. Anyone can define a new qualifier. A qualifier annotation:
- is annotated with
@Qualifier
,@Retention(RUNTIME)
, and typically@Documented
.- [...]
作为 @Documented
is optional and only affects the Javadoc,请务必添加 @Qualifier
,这样你就可以开始了。
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class WorkerContract(val value: EWorkerContracts)