【发布时间】: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