2017-11-18 30 views
1

私は別の外国のクラス(私によって制御されていない)で動作する抽象ツールクラスを作成しています。外部クラスは、インタフェースのある点では概念的には似ていますが、類似のプロパティにアクセスするための構文は異なります。また、ツールの操作の結果を適用するための構文も異なります。 this answer by @hotkeyに基づいて、内部クラスを持つデータクラスを作成しました。Kotlinの抽象コンテナツールの汎用/入出力

ここにジェネリックスの問題があります。外部クラスは基本的に要素のコンテナです。各クラスのコンテナタイプは異なります。特定のコンテナには固定要素タイプがあり、他のコンテナには汎用要素タイプがあります。私はinoutのジェネリックスの概念、このモデルとの共分散対反分散を適用することに問題があります。ここでは、ジェネリック医薬品に関して、ほぼ正確な問題と平行したCharSequenceとリストのスライスを使用した簡単な例です:

// *** DOES NOT COMPILE *** 
data class Slicer<C,E>(val obj: C, val beg: Int, val end: Int) { 
    // C is container type; E is element type 
    // but unsure how to apply in/out properly 
    inner abstract class SObj<C,E>{ 
    abstract val len: Int // an input that tool requires 
    abstract val sub: C // an output of tool (container) 
    abstract val one: E // an output of tool (element) 
    inner class TCsq(val c: CharSequence): SObj<C,E>() { 
     override val len get()= c.length 
     override val sub get()= c.substring(adjusted) // PROBLEM 
     override val one get()= c[finder+5]   // PROBLEM 
    } 
    inner class TList<E>(val l: List<E>): SObj<C,E>() { 
     override val len get()= l.size 
     override val sub get()= l.slice(adjusted)  // PROBLEM 
     override val one get()= l[finder]    // PROBLEM 
    } 
    // sample ops use both data class vals and abstract properties 
    val adjusted get()= (beg+1)..(len-1) 
    val finder get()= (end-beg)/2 
    } 
} 

私はきちんとこの仕事をするためにここに/アウトで適用するにはどうすればよいですか?また、これが最善のコンストラクトでない場合、これはどのように構造化されますか?

N.B. CharSequenceListは変更できない外国クラスを表し、adjustedfinderは、ツールがクラスで実行している多くの操作のサンプルです。今日、ツールの操作は、反復的かつ非一様な方法で様々なコンテナ内のコードベース(またはその拡張部)についてちょうど散らかっています。

答えて

1

私が正しく質問を理解している場合、分散はここでは関係ありませんが、あなただけの間違ったパラメータを得た:

inner class TCsq(val c: CharSequence): SObj<CharSequence, Char>() 

inner class TList<E>(val l: List<E>): SObj<List<E>,E>() 

をあなたこの方法を行うことはできませんどのような「Eを変更する」操作を行うことです:これは、Kotlinがサポートしていない高級タイプを必要とします。

+0

私の質問のように見える両方の少しだった。修正したコードを簡略化したときにエラーが発生しました。しかし、実際のコードの一部は、あなたが予測したように、 'E'を変更しようとしています。 (私の例では本当にそのうちの1つを入れておかなければなりませんでしたが、あなたはその例を見ずにそれを理解しました)私はコンテナの型に '' inと ''の異なる組み合わせを試みていましたが、それは実際にはこれらのジェネリック医薬品よりも高い注文であるため、そのどれも作用しません。 – sirksel

+0

これをサポートする言語はごくわずかですが、実際にはJVMには1つあります:Scala。あなたはそれがオプションかどうかを検討するかもしれません。 –

関連する問題