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

为什么Kotlin中的val box1和val box2都正确?,kotlin,Kotlin,我是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) 类框(val值:T) val box1:Box=Box(1) val box2:Box=B

我是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)
类框(val值:T)
val box1:Box=Box(1)
val box2:Box=Box(1)
val box3=框(1)

这三行都是“正确”的,并以完全相同的方式创建完全相同的实例。它们只使用Kotlin提供的不同级别的类型推断(即它可以自己从上下文中找出类型和类型参数),从最详细的第一个到最简洁的最后一个


由于这些行的功能完全没有区别,因此您可以选择使用您最容易阅读的行。

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

构造函数的值参数
1
具有类型
T
,而
Box
具有相同的类型参数
T

编译器知道
1
的类型为
Int
,因此
T
=
Int
,以便
框(1)
=
框(1)


Box(1)
的类型通常是
Box
,因此
box2
box3
的类型都是
Box
它们是正确的,但并不总是相同的。让我们一个接一个地看一遍

val box1: Box<Int> = Box<Int>(1)
val box3 = Box(1)
box1可以是实现IBox的任何对象,而
box3
Box


这使得第一个是
,而不是

很好地说明,通过给出显式类型,您可以使用推断类型以外的其他类型。但这三个例子是相同的,这就是问题所在。
val box1: IBox<Int> = Box<Int>(1)
val box3 = Box(1)
Box<Int>(1)
Box(1)
Box<Number>(1)
Box(1)