【发布时间】:2021-11-15 07:16:19
【问题描述】:
我现在正用头撞墙,因为我想不通。
我有一个名为Mapper 的通用接口,它有两个通用类型参数。现在我想利用多重绑定并将这个接口的多个实现绑定到Map<Class<out Any>, Provider<Mapper<Any, Any>> 类型的映射中。我的代码如下所示:
interface Mapper<DTO, Entity> {
fun toEntity(model: DTO): Entity
fun toDto(model: Entity): DTO
}
class PersistedIntakeEntryMapper @Inject constructor() : Mapper<PersistedIntakeEntry, IntakeEntry> {
override fun toEntity(model: PersistedIntakeEntry): IntakeEntry { TODO() }
override fun toDto(model: IntakeEntry): PersistedIntakeEntry { TODO() }
}
@Module
interface MapperModule {
@Binds
@IntoMap
@MapperKey(PersistedIntakeEntry::class)
@ModelMappers
fun bindPersistedIntakeEntryMapper(mapper: PersistedIntakeEntryMapper): Mapper<Any, Any>
}
@Singleton
class MapperFactory @Inject constructor(
@ModelMappers val mappers: Map<Class<out Any>, @JvmSuppressWildcards Provider<Mapper<Any, Any>>>,
) {
@Suppress("UNCHECKED_CAST")
inline fun <reified DTO: Any, Entity> get(): Mapper<DTO, Entity>? {
TODO()
}
}
Dagger 特别抱怨PersistedIntakeEntryMapper 不能分配给Mapper<Any, Any>:MapperModule.java:13: error: @Binds methods' parameter type must be assignable to the return type。
然而:奇怪的是,我对另一个像魅力一样工作的组件有相同的设置:
interface ViewModelFactory<VM : ViewModel, SavedState, Parameters> {
fun create(savedState: SavedState?, parameters: Parameters?): VM
}
class SetCalorieGoalViewModelFactory @Inject constructor(
private val getCalorieGoalUseCase: GetCalorieGoalUseCase,
private val setCalorieGoalUseCase: SetCalorieGoalUseCase,
private val navigator: Navigator,
) : ViewModelFactory<SetCalorieGoalViewModel, SetCalorieGoalUiState, Nothing> {
override fun create(savedState: SetCalorieGoalUiState?, parameters: Nothing?): SetCalorieGoalViewModel {
TODO()
}
}
@Module
interface SetCalorieGoalUiModule {
@Binds
@IntoMap
@ViewModelKey(SetCalorieGoalViewModel::class)
fun bindSetCalorieGoalViewModelFactory(factory: SetCalorieGoalViewModelFactory)
: ViewModelFactory<ViewModel, Any, Any>
}
我可以毫无问题地将SetCalorieGoalViewModelFactory 绑定到ViewModelFactory<SetCalorieGoalViewModel, Any, Any> 类型。这些设置使其中一个工作而另一个不工作的设置之间有什么区别?我这辈子都想不通。非常感谢任何试图解决此问题的人。
【问题讨论】:
-
我认为是因为
interface Mapper<DTO, Entity>中的类型没有定义。意思是,它也可以为空。所以制作这个interface Mapper<DTO : Any, Entity : Any>看看它是否有效 -
好声,感谢您的回复,但不幸的是它没有帮助,仍然是同样的问题。