不兼容的类型:A和kotlin.reflect.KType

Max*_*kov 3 kotlin

我想检查该函数是否具有A类型参数使用以下代码:

import kotlin.reflect.*
import javafx.event.ActionEvent

interface IA {}

class A {}

class B {
    fun test(a: A, ia: IA, event: ActionEvent) {
        println(a)
        println(ia)
        println(event)
    }
}

fun main(args: Array<String>) {
    for (function in B::class.declaredMemberFunctions) {
        for (parameter in function.parameters) {
            when (parameter.type) {
                is IA -> println("Has IA interface parameter.")
                is ActionEvent -> println("Has ActionEvent class parameter.")
                is A -> println("Has A class parameter.") // <---- compilation error in this line
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译它时,我看到以下错误:

> Error:(20, 19) Incompatible types: A and kotlin.reflect.KType
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么编译器不会引发IA接口和ActionEventJava类的错误?
  2. 为什么compiller会A上课错误?
  3. 如何检查该函数是否有A类型的参数?

Mic*_*ael 5

问题是你要检查是否KTypeA,总是如此false.并且编译器知道它并引发编译错误.但是IA实现的类的接口是否KType也可能实现此接口,因此没有编译错误.ActionEvent是一个开放类,所以它的子类型可以实现KType- 也没有编译错误.

您应该做什么来检查参数类型是某个类还是某个接口,如下所示.

when (parameter.type.javaType) {
    IA::class.javaClass -> println("Has IA interface parameter.")
    ActionEvent::class.javaClass -> println("Has ActionEvent class parameter.")
    A::class.javaClass -> println("Has A class parameter.")
}
Run Code Online (Sandbox Code Playgroud)