我创建了扩展方法:
@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/