I recently tried the following in Kotlin.
The idea is that I will receive as input an Item (like AmericanItem for instance) that extends BaseItem.
I am trying to have a different parser for each of theses items
Here is a sample code
abstract class BaseItem
class AmericanItem : BaseItem()
class EuropeanItem : BaseItem()
interface ItemParser<T : BaseItem> {
fun parse(item: T)
}
class AmericanItemParser : ItemParser<AmericanItem> {
override fun parse(item: AmericanItem) {
println("AmericanItemParser")
}
}
class EuropeanItemParser : ItemParser<EuropeanItem> {
override fun parse(item: EuropeanItem) {
println("parsing EuropeanItem")
}
}
fun main(args: Array<String>) {
val hashMap = HashMap<Class<out BaseItem>, ItemParser<*>>()
hashMap.put(AmericanItem::class.java, EuropeanItemParser())
hashMap.put(EuropeanItem::class.java, AmericanItemParser())
val inputItem = EuropeanItem()
val foundParser = hashMap[inputItem.javaClass]
foundParser?.parse(inputItem)
}
My issue is at the very last line, when I am trying to invoke the parser, I am getting the following compilation error
Out-projected type 'ItemParser<*>?' prohibits the use of 'public abstract fun parse(item: T): kotlin.Unit defined in ItemParser'
What am I doing wrong here ?