我是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)
答案 0 :(得分:6)
所有这三行都是“正确的”,并以完全相同的方式创建完全相同的实例。他们只是使用Kotlin提供的各种类型的类型推断(即它可以从上下文中找出类型和类型参数),从最详细的第一个到最简洁的最后一个。
由于这些线条的作用完全没有区别,因此您可以根据自己的喜好选择最适合自己的线条。
答案 1 :(得分:2)
它们是正确的但并不总是相同的。让我们逐一介绍它们。
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可以是在box3
为Box<Int>
时实现IBox的任何对象。
Box<Int>(1)
Box(1)
这与上面的类似。第一个明确声明,第二个让编译器弄明白。因为1
是Int
,所以它们是相同的。但是,这并非总是如此。
Box<Number>(1)
Box(1)
这使第一个成为Box<Number>
而不是Box<Int>
答案 2 :(得分:1)
看起来Kotlin根据你为Box构造函数提供的值来推断类型。它们都是有效的,因为编译器可以确定泛型类型T
将是类型Int
。如果您更明确,那么可能在编译时进行一些优化,但我认为这主要只是一个偏好问题。
答案 3 :(得分:1)
构造函数的值参数1
的类型为T
,Box<T>
具有相同的类型参数T
。
编译器知道1
的类型为Int
,所以
T
= Int
,Box(1)
= Box<Int>(1)
。
Box<Int>(1)
的类型非常Box<Int>
,因此box2
和box3
都具有Box<Int>
类型。