2016-05-23 10 views

答えて

13

など、多くのパラメータを持つコンストラクタと機能のために、名前付き引数を使用した場合に、より明確に読むもののためにこれを行うことができるようにしたいのですがSTDLIBからNothingを使用して、1.0:Array<Nothing>として

/* requires passing all arguments by name */ 
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {} 
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
//f0(0, 1, 2)      // doesn't compile without each required named argument 

/* requires passing some arguments by name */ 
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {} 
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
f1(0, arg1 = 1, arg2 = 2)   // compiles without optional named argument 
//f1(0, 1, arg2 = 2)    // doesn't compile without each required named argument 

vararg nothings: Nothingの値が(私は仮定反射の短い)に渡されるために作成することができない、Kotlinで違法です。これはちょっとハックしているようですが、空の配列Nothingのバイトコードにオーバーヘッドがあると思われますが、うまくいくようです。

このアプローチは、varargを使用できないデータクラスプライマリコンストラクタでは機能しませんが、privateとマークでき、セカンダリコンストラクタはvararg nothings: Nothingとして使用できます。

しかし、このアプローチはKotlin 1.1では使用できません: "禁止された可変パラメータ型:なし"。 :

ありがたいことに、希望はKotlin 1.1で失われていません。プライベートコンストラクタ(Nothingなど)で独自の空のクラスを定義し、それを最初のvarargsパラメータとして使用してこのパターンを複製できます。

+14

これは決して言語の設計によって意図されていませんでしたがあなたの工夫に拍手を送ってください:) –

+0

* arrayOf ()でNothingの配列を広げることができます。または、あなたができるはずです、私は考えている – Deanveloper

+0

@Deanveloper私はそれを試してみました。私は "Unsuppored [戻り値の型で配列が不正です"と "型のパラメータとしてNothing 'を使用できません"。可能であれば、例えば 'f0(* arrayOf ()、0,1,2)'の後続の引数は、異なる配列の内容と組み合わされ、異なるエラーが発生します: "整数リテラルは期待されるタイプNothingに従う "。 – mfulton26

関連する問題