2016-07-11 2 views
4

Create generic 2D array in Kotlinに触発されていますが、タイプTの配列を持つ汎用クラスを作成する次のコードがあります。ただし、上限を追加するとコンパイルエラーが発生します。これを行う方法はありますか?kotlinにComparable <T>の配列を持つジェネリッククラスを作成しますか?

//This code compiles: 
class GenericClass<T> protected constructor(size : Int, arrayFactory: (Int) -> Array<T>) { 
    companion object { 
    inline fun <reified T> invoke(size : Int) 
     = GenericClass(size, { size -> arrayOfNulls<T>(size) }) 
    } 
    val array = arrayFactory(size) 
} 

//Compile errors: 
class GenericClass<T : Comparator<T>> protected constructor(size : Int, arrayFactory: (Int) -> Array<T>) { 
    companion object { 
    inline fun <reified T : Comparator<T>> invoke(size : Int) 
     = GenericClass(size, { size -> arrayOfNulls<T>(size) }) 
    } 
    val array = arrayFactory(max) 
} 

コンパイルエラーは、次のとおりコンストラクタGenericClassにT行き

  • タイプパラメータ>(大きさ:INT、arrayFactory:(INT) - >配列)が満たされていない。推論タイプT?コンパイラのサブタイプではありません

答えて

3

誤解を招いている間にエラーメッセージが表示されるのは、タイプ引数とパラメータのnull可能性制約に関するヒントです。そのようなArraynullを可能にするGenericClassコンストラクタ変更:名前として

class GenericClass<T : Comparator<T>> 
    protected constructor(size : Int, arrayFactory: (Int) -> Array<T?>) { 
    companion object { 
     inline fun <reified T : Comparator<T>> invoke(size : Int) 
      = GenericClass(size, { size -> arrayOfNulls<T>(size) }) 
    } 
    val array = arrayFactory(size) 
} 

arrayOfNullsnull Sで満たさ与えsizeの配列を作成します示唆しています。したがって、あなたがそれを使用したい場合はarrayFactoryがそれを受け入れる必要があります。

+0

これはトリックでした。ありがとう –

関連する問題