为什么在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)
第一个声明box1
是Box<Int>
而box3
让编译器找出它的类型。 它们并不总是一样的。 考虑Box<T>
实现一个接口IBox<T>
。
val box1: IBox<Int> = Box<Int>(1) val box3 = Box(1)
box1可以是任何实现IBox的对象,而box3
是Box<Int>
。
Box<Int>(1) Box(1)
这与上面的类似。 第一个明确声明,第二个让编译器弄清楚。 因为1
是Int
,所以相同。 但是,这并不总是如此。
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>
,所以box2
和box3
的类型都是Box<Int>
。