对象的类型和val之间的差异

时间:2017-06-03 17:59:25

标签: singleton kotlin type-alias

对于某个类,很明显我们不能使用val来引用类型。

例如,

class LongName {
    ...
}

typealias A = LongName // OK
val B = LongName // compile error
val C = LongName() // compiles, but it refers to an instance, not the class itself

然而,对于(单例)对象,两者都编译。此外,两者都可以用于其成员。

object LongName {
    val a = "123"
}

typealias A = LongName
val B = LongName

...

// In a function,
println(A.a) // compiles
println(B.a) // compiles

他们之间有什么区别?

2 个答案:

答案 0 :(得分:2)

您可以通过名称引用object的单个实例,在本例中为LongName(这就是为什么您可以将其分配给val):

println(LongName.a)

val longName = LongName
println(longName.a)

您还可以将其类型称为LongName(这就是您可以为其创建typealias的原因):

fun doStuff(longName: LongName) {}

typealias LN = LongName
fun doStuff(longName: LN) {}

答案 1 :(得分:2)

typealias分配给类或对象将始终有效,因为您只是为其指定了另一个名称。来自docs

  

类型别名为现有类型提供替代名称。如果类型名称太长,您可以引入一个不同的较短名称,而不是使用新名称。

虽然分配val是不同的。 val只能用于属性或对象。

在你的第一个例子中,

  

val B = LongName

此处编译器尝试查找对象或属性,并将其分配给B,但它不能,因为LongName是一个类,它也没有任何companion object

如果您使用类

等类定义伴随对象
class LongName {
    companion object {
        val a = "123"
    }
}

然后你可以像

那样访问它
val b = LongName
info(b.a) //123

尽管以这种方式执行此操作并没有多大意义,因为您始终可以companion object静态访问LongName.a中的属性。