2017-06-03 9 views
1

クラスについては、タイプを参照するのに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 

しかし、(シングルトン)オブジェクトの、両方がコンパイル。さらに、その両方のメンバーに使用することができます。

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

あなたはLongName(あなたがvalに割り当てることができ、なぜこれがある)として、この場合には、その名前によってobjectの単一のインスタンスを参照することができます。

println(LongName.a) 

val longName = LongName 
println(longName.a) 

そして、あなたはまた、を参照することができますLongNameとしてのタイプは、(あなたがそれのためにtypealiasを作成することができる理由です):あなたはそれに別の名前を与えているため、クラスやオブジェクトにtypealiasを割り当てる

fun doStuff(longName: LongName) {} 

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

は常に動作します。 docsから

タイプエイリアスは、既存のタイプの代替名を提供します。タイプ名が長すぎる場合は、別の短縮名を使用して新しい名前を使用することができます。

valの割り当ては異なりますが、 valは、プロパティまたはオブジェクトに対してのみ使用できます。あなたの最初の例で

ヴァルB = LONGNAME

LongNameはクラスであり、ので、ここでは、コンパイラは、オブジェクトやプロパティを見つけて、それができないBに割り当てしようとしますいずれもcompanion objectはありません。場合

、あなたは、のような

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

をクラスでコンパニオンオブジェクトを定義した場合、それはそれを行うにはあまり意味がありませんが、あなたは、のような

val b = LongName 
info(b.a) //123 

にアクセスすることができますあなたは常にcompanion objectのプロパティにアクセスでき、このように静的にはLongName.aのようになります。

関連する問題