2017-06-03 92 views
1

对于一个类,显然我们不能使用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 

它们之间有什么不同?

+0

val C = LongName :: class //引用LongName的类 –

回答

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) {} 
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

相关问题