【问题标题】:Kotlin TypeCastingKotlin 类型转换
【发布时间】:2020-01-03 10:32:37
【问题描述】:

即使结果相同,以下 3 个之间有什么区别?

val binding = DataBindingUtil.inflate<MyBinding>(LayoutInflater.from(view.context), R.layout.my_layout,
    null, false)

val binding: MyBinding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout,
    null, false)

val binding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout,
    null, false) as MyBinding

【问题讨论】:

    标签: android kotlin casting


    【解决方案1】:

    让我解释一下它的基本原理!

    val 绑定 = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout, 空,假)

    binding 将是从 RHS 返回的任何类型。这可能返回的唯一错误是运行时错误,说 null 不能是不可为空类型的值

    val 绑定:MyBinding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout, 空,假)

    与上述相同,但如果两种类型不匹配,可能会抛出 编译时错误,如 Type mismatch. Required: XXX Found: YYY

    val 绑定 = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout, null, false) 作为 MyBinding

    这应该主要用于派生类,但在正常情况下也可以使用。这不会抛出任何编译时错误,但如果转换不成功会抛出运行时异常

    【讨论】:

    • 感谢您的回答。在第一种情况下,您提到“绑定将是从 RHS 返回的任何类型”,但明确提到了 MyBinding(在膨胀之后)。
    • 同样的 LHS 也可以用来表示布尔值。所以 LHS 与 RHS 返回的类型无关
    • 好吧,由于类型擦除,您可以在所有 3 种情况下出现运行时转换错误,而不仅仅是第三种情况。
    【解决方案2】:

    没有真正的区别。完整版是

    val binding: MyBinding = DataBindingUtil.inflate<MyBinding>(...)
    

    但是如果你省略了变量类型(: MyBinding),它是从类型参数中推断出来的,反之亦然。 (在这种情况下它们是相同的,因为这个特定方法的签名。)

    Kotlin 还允许从立即转换中推断类型参数,就像在您的第三个示例中一样。 IIRC 这是为一个非常具体的用例而引入的(一些用于返回超类型但后来变成通用的方法?)并且没有真正的理由使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2023-03-06
      • 2019-05-25
      • 2020-04-30
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多