Котлин внепроектного типа запрещает использование

Damien Locque спросил: 07 октября 2018 в 10:36 в: generics

Недавно я попробовал следующее в Kotlin. Идея состоит в том, что я получу в качестве входных данных Item (например, AmericanItem), который расширяет BaseItem. Я пытаюсь иметь разные парсеры для каждого из этих элементов. Вот пример кода

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)
}

Моя проблема в самой последней строке, когда я пытаюсь вызвать парсер, я получаю следующую ошибку компиляции

Out-projected type 'ItemParser<*>?' prohibits the use of 'public abstract fun parse(item: T): kotlin.Unit defined in ItemParser'

Что я здесь не так делаю?


0 ответов