Generics 与泛型和自动类型转换相关的Kotlin werid编译错误

Generics 与泛型和自动类型转换相关的Kotlin werid编译错误,generics,kotlin,Generics,Kotlin,我认为这段代码应该编译: 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>) :

我认为这段代码应该编译:

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

这是一个问题,但他们还没有回应,所以我会一直保持开放状态,直到他们核实或者有人来责骂我的愚蠢。

看来聪明的演员还不够聪明。但您可以使用以下方法给出提示:

val <T : AccessibleObject> T.descriptor: Descriptor
get() = when (this) {
    is Invokable<*, *> -> {
        Descriptor(this.declaringClass,
                this.modifiers,
                info,
                this.declaringClass.info)
    }
    else -> throw AssertionError()
}
val T.descriptor:描述符
get()=当(此){
是可调用的->{
描述符(此.declaringClass,
这是修饰语,
信息,
这个。declaringClass.info)
}
else->抛出断言错误()
}

不需要使用val的东西。你只需要给它一些“东西”去做。当IDE上没有任何可“突出显示”的内容时,它可能会很混乱:)

什么是
foo
?请出示它的护照declaration@voddan实际上,这是一个描述符。很抱歉出错。我看不到可调用的
val.declaringClass
任何地方。你也能提供那个代码吗?@voddan这是一个google guava类,上面已经提供了一个在线参考。哦,我还以为这是你在
Invokable
上的扩展属性呢。谢谢
val <T : AccessibleObject> T.descriptor: Descriptor
get() = when (this) {
    is Invokable<*, *> -> {
        Descriptor(this.declaringClass,
                this.modifiers,
                info,
                this.declaringClass.info)
    }
    else -> throw AssertionError()
}