Diferencia entre typealias y val para el object

Para una class, está claro que no podemos usar val para referirnos a un tipo.

Por ejemplo,

 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 

Sin embargo, para un object (singleton), ambas comstackn. Además, ambos pueden usarse para sus miembros.

 object LongName { val a = "123" } typealias A = LongName val B = LongName ... // In a function, println(Aa) // compiles println(Ba) // compiles 

¿Cuál es la diferencia entre ellos?

    Puede referirse a la instancia única de un object por su nombre, en este caso, como LongName (esta es la razón por la que puede asignarlo a un val ):

     println(LongName.a) val longName = LongName println(longName.a) 

    Y también puede referirse a su tipo como LongName (esta es la razón por la que puede crear un typealias para él):

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

    Asignar un typealias a una class o un object siempre funcionará porque solo le está dando otro nombre. De los documentos ,

    Los alias tipo proporcionan nombres alternativos para los types existentes. Si el nombre del tipo es demasiado largo, puede introducir un nombre más corto diferente y usar el nuevo en su lugar.

    Si bien la asignación de un val es diferente. val solo se puede usar para properties u objects.

    En tu primer ejemplo,

    val B = LongName

    aquí el comstackdor intenta encontrar un object o propiedad y asignarlo a B que no puede, porque LongName es una class y tampoco tiene ningún companion object .

    En caso, si defines un object compañero con la class como,

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

    Entonces puedes acceder como,

     val b = LongName info(ba) //123 

    Aunque no tiene mucho sentido hacerlo de esta manera, ya que siempre tiene acceso a properties en el companion object estáticamente como LongName.a .