对象的typealias和val之间的区别
问题描述:
对于一个类,显然我们不能使用val
来引用某个类型。对象的typealias和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
它们之间有什么不同?
答
你可以参考的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) {}
答
分配一个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
。
val C = LongName :: class //引用LongName的类 –