3

我创建了扩展方法:

@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 类的方法。

在科特林有可能吗?也许以某种方式对泛型类型的签名进行一些更改?

4

1 回答 1

0

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

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

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

于 2018-06-16T04:13:31.997 回答