Объединяя рефлексию, перечисления и дженерики в Kotlin, вывод типов не выполняется, но я тоже не знаю - PullRequest
1 голос
/ 28 мая 2019

Я использую рефлексию для загрузки класса Enum, который я использую для интеграции с существующим Java-приложением. В Java это записывается как (в классе ValueUtil):

static <E extends Enum<E>> Class<E> getEnumType(String typeAsString) { ..reflection stuff.. }

В Kotlin я пытаюсь использовать результат этого метода.

private fun createEnumParameter(type: String, value: String, id: String?): EnumParameter<*> {
    val clazz = getEnumType(type)
    return createParam(clazz, value, id)
}

private fun <E: Enum<E>> getEnumType(type: String): Class<E> {
    return ValueParseUtil.getEnumType<E>(type)
}

private fun createParam(...): ... { ... }

Однако, компилятор заявляет: Ошибка вывода типа

Поэтому я стараюсь изо всех сил, чтобы указать то, что я знаю (Enum <*>): Enum <*> ошибка

Это не удается из-за рекурсии enum в дженериках (которые, кстати, нужны I / Kotlin / Java).

Является ли отражение + перечисления + генерики рецептом для ошибок компилятора?

Есть предложения как это исправить?

1 Ответ

1 голос
/ 28 мая 2019

Когда конкретный рекурсивный универсальный тип неизвестен, вы можете эмулировать необработанные типы, подавив эту ошибку:

@Suppress("UPPER_BOUND_VIOLATED")
val clazz = getEnumType<Enum<*>>(type)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...