kotlin - 如何比较 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 做错了什么。
解决方案
您正在将反射类型与实际的类类型混合。is
对实际课程的测试虽然java.lang.reflect.Type
有所不同。此外,Type
它不是 UserSettings 的父类,也不是实现接口。
如果你想测试你的类型是否引用了 UserSettings,你必须使用Type::getTypeName
或通过查询 UserSettings 的类型名称来进行比较。以下代码应该可以工作:
if(type == UserSettings::class.java)
return HtmlConverter.INSTANCE
else
return null
推荐阅读
- iis - 如何从 iPad 连接到在我的计算机上提供服务的 IIS 站点?
- sql-server - SSIS,使用 SQL Server 中的 ID 查询 Oracle 表?
- arrays - Excel - Sumifs 使用数组引用单元格
- node.js - 浏览器未收到由部署在云端分布后面的 elb 中的 express 应用程序发送的 Cookie 标头
- bootstrap-vue - 进度条(b-progress-bar)没有动画
- ssl - 带有 vagrant 文件的 podman 设置失败
- javascript - 完成所有承诺后退出节点
- python - 如何防止未检测到的 chromedriver 在最后一行代码后关闭窗口
- gcloud - td-agent 不验证谷歌云服务帐户凭据
- sql - 按来自 nvarchar(MAX) 列的订单 ID 过滤是否会受益于全文搜索?