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

时间:2017-07-14 06:41:38

标签: 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)

4 个答案:

答案 0 :(得分:6)

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

由于这些线条的作用完全没有区别,因此您可以根据自己的喜好选择最适合自己的线条。

答案 1 :(得分:2)

它们是正确的但并不总是相同的。让我们逐一介绍它们。

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可以是在box3Box<Int>时实现IBox的任何对象。

Box<Int>(1)
Box(1)

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

Box<Number>(1)
Box(1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

构造函数的值参数1的类型为TBox<T>具有相同的类型参数T

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

Box<Int>(1)的类型非常Box<Int>,因此box2box3都具有Box<Int>类型。