为什么在Kotlin中val box1和val box2都是正确的?

我是Kotlin的初学者,下面的代码是来自网页的,val box3是正确的。

我被告知val box1和val box2都是正确的。 为什么?

class Box<T>(val value: T) val box1: Box<Int> = Box<Int>(1) val box2: Box<Int> = Box(1) val box3 = Box(1) 

所有这三行都是“正确的”,并以完全相同的方式创建完全相同的实例。 他们只是使用Kotlin提供的不同层次的类型推断(即可以从上下文中自行计算出类型和类型参数),从最冗长的第一个到最简洁的最后一个。

由于这些行的内容完全没有区别,因此您可以选择使用哪一个对您最具可读性。

他们是正确的,但并不总是一样的。 让我们一一浏览。

 val box1: Box<Int> = Box<Int>(1) val box3 = Box(1) 

第一个声明box1Box<Int>box3让编译器找出它的类型。 它们并不总是一样的。 考虑Box<T>实现一个接口IBox<T>

 val box1: IBox<Int> = Box<Int>(1) val box3 = Box(1) 

box1可以是任何实现IBox的对象,而box3Box<Int>

 Box<Int>(1) Box(1) 

这与上面的类似。 第一个明确声明,第二个让编译器弄清楚。 因为1Int ,所以相同。 但是,这并不总是如此。

 Box<Number>(1) Box(1) 

这使得第一个Box<Number>而不是Box<Int>

看起来Kotlin是根据您为Box构造函数提供的值推断出的类型。 它们都是有效的,因为编译器可以发现泛型类型T将会是一个Int类型。 如果你更清楚的话,编译时可能会有一些优化,但我认为这主要是一个偏好问题。

构造函数的值参数1具有类型T ,并且Box<T>具有相同的类型参数T

编译器知道1的类型是Int ,所以T = Int ,所以Box(1) = Box<Int>(1)

Box<Int>(1)Box<Int> ,所以box2box3的类型都是Box<Int>