我有一個使用泛型下面的代碼:科特林仿製藥:在通用映射參數類型不匹配
abstract class Event(val name: String)
interface ValueConverter<E : Event> {
fun convert(event: E): Float
fun getEventClass(): Class<E>
}
class ValueConverters {
private val converters = HashMap<String, ValueConverter<Event>>()
fun <E : Event> register(converter: ValueConverter<E>) {
converters.put(converter.getEventClass().name, converter)
}
fun unregister(eventClass: Class<Event>) {
converters.remove(eventClass.name)
}
fun <E : Event> convert(event: E): Float {
return converters[event.javaClass.name]?.convert(event) ?: 0.0f
}
fun clear() {
converters.clear()
}
}
但在這條線:
converters.put(converter.getEventClass().name, converter)
它給出了一個錯誤:
Type mismatch. Expected ValueConverter<Event>. Found ValueConverter<E>.
我也試過這樣的事情:
class ValueConverters {
private val converters = HashMap<String, ValueConverter<Event>>()
fun register(converter: ValueConverter<Event>) {
converters.put(converter.getEventClass().name, converter)
}
fun unregister(eventClass: Class<Event>) {
converters.remove(eventClass.name)
}
fun convert(event: Event): Float {
return converters[event.javaClass.name]?.convert(event) ?: 0.0f
}
fun clear() {
converters.clear()
}
}
但問題是像調用ValueConverters.register()
時:
class SampleEvent1 : Event(name = SampleEvent1::class.java.name)
class SampleValueConverter1 : ValueConverter<SampleEvent1> {
override fun convert(event: SampleEvent1): Float = 0.2f
override fun getEventClass(): Class<SampleEvent1> = SampleEvent1::class.java
}
converters.register(converter = SampleValueConverter1())
這也給了相似的類型不匹配的錯誤。
我該如何聲明泛型,以便我可以使用任何實現ValueConverter的類並接受任何擴展Event的類?
謝謝!有用。 –