Tôi có đoạn mã sau sử dụng Generics:Generics Kotlin của: Kiểu không khớp trong tham số bản đồ chung
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()
}
}
Nhưng trên dòng này:
converters.put(converter.getEventClass().name, converter)
nó mang lại một lỗi:
Type mismatch. Expected ValueConverter<Event>. Found ValueConverter<E>.
Tôi cũng đã thử một số nội dung như sau:
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()
}
}
Nhưng vấn đề là khi gọi ValueConverters.register()
với một cái gì đó như:
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())
Nó cũng cung cấp cho các sai lầm loại không phù hợp tương tự.
Làm cách nào để khai báo các generics để tôi có thể sử dụng bất kỳ lớp nào triển khai ValueConverter và chấp nhận bất kỳ lớp nào mở rộng Sự kiện?
Cảm ơn! Nó hoạt động. –