Mam następujący kod, który używa rodzajowych:Kotlin za rodzajowych: Niezgodność typu parametru rodzajowy mapy
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()
}
}
Ale na tej linii:
converters.put(converter.getEventClass().name, converter)
daje błąd:
Type mismatch. Expected ValueConverter<Event>. Found ValueConverter<E>.
Próbowałem również coś takiego:
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()
}
}
Ale problem jest, gdy dzwoni ValueConverters.register()
z czymś takim:
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())
Daje on również podobny błąd niezgodność typów.
W jaki sposób powinienem zadeklarować generyczne, aby móc korzystać z dowolnej klasy, która implementuje ValueConverter i akceptuje dowolną klasę rozszerzającą Wydarzenie?
Dzięki! To działa. –