首页 > 解决方案 > 如何比较 Kotlin 中的类型

问题描述

我正在尝试测试“类型”参数:

class MyConverter : Converter.Factory() {

    override fun responseBodyConverter(
        type: Type,
        annotations: Array<Annotation>,
        retrofit: Retrofit
    ): Converter<ResponseBody, *> {
        if (type is UserSettings) // Compiler complains of incompatible types
            return HtmlConverter.INSTANCE
        else
            return null
    }

    class HtmlConverter : Converter<ResponseBody, UserSettings> {
        companion object {
            val INSTANCE = HtmlConverter()
        }
    }
}

但是这行代码:

if (type is UserSettings)

给我一个编译错误,表明“类型与用户设置不兼容”

但是如果我将 type.toString() 打印到日志中,它会显示类型是 UserSettings。所以我不明白问题是什么。类似的 Java 代码可以正常工作,但这个 Kotlin 代码不能。我一定在 Kotlin 做错了什么。

标签: kotlinretrofit2

解决方案


您正在将反射类型与实际的类类型混合。is对实际课程的测试虽然java.lang.reflect.Type有所不同。此外,Type它不是 UserSettings 的父类,也不是实现接口。

如果你想测试你的类型是否引用了 UserSettings,你必须使用Type::getTypeName或通过查询 UserSettings 的类型名称来进行比较。以下代码应该可以工作:

if(type == UserSettings::class.java)
    return HtmlConverter.INSTANCE
else
    return null

推荐阅读