为什么在Kotlin中val box1和val box2都是正确的?
我是Kotlin的初学者,下面的代码是来自网页,val box3是正确的。
我被告知val box1和val box2都是正确的。 为什么?
class Box(val value: T) val box1: Box = Box(1) val box2: Box = Box(1) val box3 = Box(1)
所有这三行都是“正确的”,并以完全相同的方式创建完全相同的实例。 他们只是使用Kotlin提供的不同层次的types推断(即可以从上下文中自行计算出types和types参数),从最冗长的第一个到最简洁的最后一个。
由于这些行的内容完全没有区别,因此您可以选择使用哪一个对您最具可读性。
他们是正确的,但并不总是一样的。 让我们一一浏览。
val box1: Box = Box (1) val box3 = Box(1)
第一个声明box1
是Box
而box3
让编译器找出它的types。 它们并不总是一样的。 考虑Box
实现一个接口IBox
。
val box1: IBox = Box (1) val box3 = Box(1)
box1可以是任何实现IBox的对象,而box3
是Box
。
Box(1) Box(1)
这与上面的类似。 第一个明确声明,第二个让编译器弄清楚。 因为1
是Int
,所以相同。 但是,这并不总是如此。
Box(1) Box(1)
这使得第一个Box
而不是Box
看起来Kotlin是根据您为Box构造函数提供的值推断出的types。 它们都是有效的,因为编译器可以发现genericstypesT
将会是一个Int
types。 如果你更清楚的话,编译时可能会有一些优化,但我认为这主要是一个偏好问题。
构造函数的值参数1
具有typesT
,并且Box
具有相同的types参数T
编译器知道1
的types是Int
,所以T
= Int
,所以Box(1)
= Box
。
Box
是Box
,所以box2
和box3
的types都是Box
。