Я думаю, что этот фрагмент кода должен скомпилировать:
package bug import java.lang.reflect.* data class Descriptor(val clazz: Class<*>, val modifiers: Int, val info: List<String>) { constructor(clazz: Class<*>, modifiers: Int, vararg info: List<String>) : this(clazz, modifiers, mutableListOf<String>().apply { info.forEach { this@apply.addAll(it) } }) } private val AnnotatedElement.info: List<String> get() = getAnnotation(Info::class.java)?.values?.toList() ?: listOf<String>() annotation class Info(val values: Array<String>) /** * A simple abstraction of com.google.common.reflect.Invokable of Guava 20.0. * https://github.com/google/guava/blob/v20.0/guava/src/com/google/common/reflect/Invokable.java */ abstract class Invokable<T, R> : AccessibleObject(), Member, GenericDeclaration val <T : AccessibleObject> T.descriptor: Descriptor get() = when (this) { is Invokable<*, *> -> Descriptor(declaringClass, modifiers, info, declaringClass.info) else -> throw AssertionError() }
Вот удобная ссылка на Invokable от Google Guava . Invokable
краткое Invokable
определение.
Вышеприведенный код должен компилировать все, но компилятор выводит 3 странных сообщения, вот вывод журнала (после правильной нормализации):
e: /path/to/source.kt: (34, 44): Ошибка ввода типа: val Invokable.declaringClass: Class! не может применяться к получателю: аргументы T # 2 (тип параметра дескриптора): ()
- Получение класса списка с общим типом: List <Number> :: class
- Общие методы и наследование Котлина
- Лямбда-тип с переменным числом аргументов в Котлине?
- Сравнение списков сопоставимых данных в Котлине
- Kotlin - Проверьте, является ли общий параметр необязательным или нет?
e: /path/to/source.kt: (35, 44): Ошибка ввода типа: val Invokable.modifiers: Int не может быть применен к получателю: аргументы T # 2 (тип дескриптора): ()
e: /path/to/source.kt: (37, 44): Ошибка ввода типа: val Invokable.declaringClass: Class! не может применяться к получателю: аргументы T # 2 (тип параметра дескриптора): ()
Решение прост: назначьте это переменной и используйте эту локальную переменную. Нет ручного типа, отличного от другого или другого материала, и он будет скомпилирован. Но мне интересно, если это ошибка компилятора kotlin или мне не хватает информации о генеаторах kotlin
EDIT: Рабочий код:
package solution import java.lang.reflect.* data class Descriptor(val clazz: Class<*>, val modifiers: Int, val info: List<String>) { constructor(clazz: Class<*>, modifiers: Int, vararg info: List<String>) : this(clazz, modifiers, mutableListOf<String>().apply { info.forEach { this@apply.addAll(it) } }) } private val AnnotatedElement.info: List<String> get() = getAnnotation(Info::class.java)?.values?.toList() ?: listOf<String>() annotation class Info(val values: Array<String>) /** * A simple abstraction of com.google.common.reflect.Invokable of Guava 20.0. * https://github.com/google/guava/blob/v20.0/guava/src/com/google/common/reflect/Invokable.java */ abstract class Invokable<T, R> : AccessibleObject(), Member, GenericDeclaration val <T : AccessibleObject> T.descriptor: Descriptor get() = when (this) { is Invokable<*, *> -> { val o = this // <---------------------------------CHANGES BEGIN FROM THIS LINE Descriptor(o.declaringClass, o.modifiers, info, o.declaringClass.info) } else -> throw AssertionError() }
Это было отправлено на JetBrains, но они еще не ответили, поэтому я буду держать это в открытом доступе до тех пор, пока они не подтвердятся, или кто-то придет, ругая мою глупость.