【问题标题】:How to fix signature of generic extension method in kotlin to resolve "Type inference failed" in kotlin如何修复 kotlin 中通用扩展方法的签名以解决 kot​​lin 中的“类型推断失败”
【发布时间】:2017-08-04 10:38:43
【问题描述】:

我已经创建了扩展方法:

@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 中可以吗?也许以某种方式对泛型类型的签名进行一些更改?

【问题讨论】:

  • 我猜 Java 只是默认为 T 的绑定,如果它是有效的,但 Kotlin 没有。
  • 我找到了解决方法 view.get(R.id.text) = View.GONE 但在这种情况下我更喜欢 view.findViewById(R.id.text) 因为括号增加了很多阅读时解析语句的噪音。
  • 使用 Kotlin,您可以轻松摆脱 findViewById: kotlinlang.org/docs/tutorials/android-plugin.html
  • 现在对我来说它没用,因为它不支持片段,你无法控制何时将视图绑定到像 Butterknife 那样的字段,而且动态布局也很容易失败。

标签: generics kotlin kotlin-extension


【解决方案1】:

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

您可以像普通函数view.get&lt;TextView&gt;(R.id.text) 一样调用get 函数,而无需使用运算符重载约定。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2018-08-21
    • 2020-12-30
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多