对于某个类,很明显我们不能使用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
他们之间有什么区别?
答案 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
中的属性。