2017-10-30 14 views
0

私は未解決の参照エラーが発生するため、次のコードを記述しますが、動作しません。コトルのコンパニオンオブジェクトを持つ汎用拡張クラス

class Chromosome { 
    constructor() {} 

    companion object { 
     fun newInstance(): Chromosome { 
      return Chromosome() 
     } 
    } 
} 

class Population<T>(size: Int) where T: Chromosome { 
    var population: Array<T> = Array(size, { _ -> T.newInstance() }) 
} 

特定のクラスまたはインターフェイスを拡張する汎用タイプTが必要です。私はT()の配列のクラスコンストラクタに書くことができないので、静的なファクトリメソッドを呼び出す必要があります。 クラスがデフォルトのコンストラクタを呼び出すクラスをラップする方法はありますか?

私は別のアプローチを試みましたが、それでも動作しません。 reified型パラメータとして 'T'を使用できません。代わりにクラスを使用エラー。

class Population<T>(size: Int, init:() -> T) where T: Chromosome { 
    var population: Array<T> = Array(size, { _ -> init() }) 
} 
+0

私は 'ClassY'が'クラスY'だと思います。右? –

+0

これはKotlinのようにJavaでは問題があります。どのようにこれをJavaで正確に実装しますか? – tynn

+0

@tynn良い質問です。私はJavaで実装しようとしましたが、動作しません。だから、あなたはこれが両方の言語で問題があると言ったときに正しいです。 – Mpac

答えて

1

Arrayタイプは、配列のJavaと同じ働きをします。したがって、それは特別であり、ジェネリックスでうまく機能しません。代わりに、JavaListというアプローチを使用する必要があります。これはMutableListコトリンに使用することを意味します。

オープンクラスまたは抽象クラスとしてChromosomeを実装してください。そうでなければ、人口を一般化させる必要はなく、Arrayアプローチは再び有効になります。

0

あなたは以下のようなコードとしてあなたPopulationクラスを試すことができます。

class Population<T : Class<*>>(size: Int) where T: Chromosome { 
... 
} 

クラスのジェネリック型を取得することができ、コードの上ごPopulationクラスをすることができます使用します。

私はそれがあなたを助けてくれることを願っています。

+0

あなたの提案をありがとうが、動作しません。私はこれらのエラーが発生します:** Tの上の境界は空の交差**を持っています**上の境界の1つだけがクラス**になることができます。 – Mpac

関連する問題