Разница между типами и val для объекта

Для класса ясно, что мы не можем использовать 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 

Однако для объекта (singleton) оба компилируются. Кроме того, оба могут использоваться для своих членов.

 object LongName { val a = "123" } typealias A = LongName val B = LongName ... // In a function, println(Aa) // compiles println(Ba) // 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 для класса или объекта всегда будет работать, потому что вы просто даете ему другое имя. Из документов ,

    Типичные псевдонимы предоставляют альтернативные имена для существующих типов. Если имя типа слишком длинное, вы можете ввести другое более короткое имя и вместо него использовать новый.

    Хотя присвоение значения val отличается. val может использоваться только для свойств или объектов.

    В вашем первом примере,

    val B = LongName

    здесь компилятор пытается найти объект или свойство и назначить его B который он не может, поскольку LongName – это класс, и у него также нет никакого companion object .

    В случае, если вы определяете объект-компаньон с таким классом,

     class LongName { companion object { val a = "123" } } 

    Затем вы можете получить к нему доступ,

     val b = LongName info(ba) //123 

    Хотя это не имеет большого смысла делать так, поскольку у вас всегда есть доступ к свойствам в companion object статически подобном LongName.a .