generics - 如何修复 kotlin 中通用扩展方法的签名以解析 kotlin 中的 "Type inference failed"

标签 generics kotlin kotlin-extension

我创建了扩展方法:

@Suppress("UNCHECKED_CAST")
operator fun <T : View> View.get(@IdRes id:Int): T  =
        this.findViewById(id) as T

该方法主要用法:

class A {
    lateinit var text: TextView

    fun init(view:View) {
        text = view[R.id.text]
    }
}

这工作得很好,但是当我尝试在没有变量的情况下使用它时:

fun test() {
    view[R.id.text].visibility = View.GONE // error
}

错误:

Type inference failed: Not enough information to infer parameter T in 
operator fun <T : View> View.get(id: Int): T
Please specify it explicitly.

如果我用java编写模拟代码,则可以使用View类的方法,而无需直接指定View类型。

在 kotlin 中可以吗?也许以某种方式对泛型类型的签名进行一些更改?

最佳答案

不可能在 get 运算符上指定泛型类型,编译器也不可能推断 get 应返回什么类型。

您可以将 get 函数作为普通函数来调用 view.get<TextView>(R.id.text) ,不使用运算符重载约定。

要实现所需的功能,您可以使用 Kotlin Android Extensions按照@Miha_x64的建议,无需使用 findViewById方法。

关于generics - 如何修复 kotlin 中通用扩展方法的签名以解析 kotlin 中的 "Type inference failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45504655/

相关文章:

java - 如何限制通用类型的接口(interface)只接受实现类

Typescript:排除<T, K> 不排除我的类型

linq-to-sql - 实现 IEnumerable

kotlin - break or return from when 表达式

kotlin - kotlin 扩展属性的惰性初始化器中的这个引用

Android Kotlin Kotlinx 模块级别 View 绑定(bind)

swift - 组合未知数量的 Observable

kotlin - 期望顶级声明出现顶级声明错误

android - 为什么 ExoPlayer 的视频初始加载时间超过 5 秒?

kotlin - 需要 <对象> 并找到 <对象>?