英文:
Kotlin TypeCasting
问题
以下是这三个尽管都产生相同结果但不同之处的翻译:
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
英文:
What is the difference between the following 3 even though all yield the same result?
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
答案1
得分: 4
binding
将是从RHS返回的类型。唯一可能返回的错误是运行时错误,指出“null不能是非空类型的值”。
val binding: MyBinding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout, null, false)
与上面相同,但如果两个类型不匹配,可能会引发编译时错误,显示Type mismatch. Required: XXX Found: YYY
。
val binding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout, null, false) as MyBinding
这主要用于派生类,但在正常情况下也适用。这不会引发编译时错误,但如果转换不成功,将引发运行时异常。
英文:
Let me explain the very basic of it!
>val binding = DataBindingUtil.inflate<MyBinding>(LayoutInflater.from(view.context), R.layout.my_layout,
null, false)
binding
will be of type whatever is returned from RHS. Only error this could return is a run time error saying null cannot be the value of a non-nullable type
>val binding: MyBinding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout,
null, false)
Same as above but could throw compile-time error saying Type mismatch. Required: XXX Found: YYY
if both types don't match.
>val binding = DataBindingUtil.inflate(LayoutInflater.from(view.context), R.layout.my_layout,
null, false) as MyBinding
This should be mainly used for derived classes but work in normal case too. This would not throw any compile time errow but would throw Run time exceptions if casting is not successful.
答案2
得分: 2
没有真正的区别。完整版本是:
val binding: MyBinding = DataBindingUtil.inflate<MyBinding>(...)
但是如果省略变量类型(: MyBinding
),它会从类型参数中推断出来,反之亦然(它们在这种情况下相同,因为这个特定方法的签名)。Kotlin还允许从立即的强制转换中推断类型参数,就像在您的第三个示例中一样。如果我记得没错,这是为了一个相当特定的用例而引入的(某个方法以前返回一个超类型,但后来变成了泛型?),否则没有真正的理由使用它。
英文:
There's no real difference. The full version would be
val binding: MyBinding = DataBindingUtil.inflate<MyBinding>(...)
but if you leave out the variable type (: MyBinding
), it is inferred from the type parameter, and vice versa. (They are the same in this case, because of this particular method's signature.)
Kotlin also allows inferring type parameters from an immediate cast, like in your third example. IIRC this was introduced for a pretty specific use-case (some method used to return a supertype but later became generic?) and there is no real reason to use it otherwise.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论