私は別の外国のクラス(私によって制御されていない)で動作する抽象ツールクラスを作成しています。外部クラスは、インタフェースのある点では概念的には似ていますが、類似のプロパティにアクセスするための構文は異なります。また、ツールの操作の結果を適用するための構文も異なります。 this answer by @hotkeyに基づいて、内部クラスを持つデータクラスを作成しました。Kotlinの抽象コンテナツールの汎用/入出力
ここにジェネリックスの問題があります。外部クラスは基本的に要素のコンテナです。各クラスのコンテナタイプは異なります。特定のコンテナには固定要素タイプがあり、他のコンテナには汎用要素タイプがあります。私はin
対out
のジェネリックスの概念、このモデルとの共分散対反分散を適用することに問題があります。ここでは、ジェネリック医薬品に関して、ほぼ正確な問題と平行した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. CharSequence
とList
は変更できない外国クラスを表し、adjusted
とfinder
は、ツールがクラスで実行している多くの操作のサンプルです。今日、ツールの操作は、反復的かつ非一様な方法で様々なコンテナ内のコードベース(またはその拡張部)についてちょうど散らかっています。
私の質問のように見える両方の少しだった。修正したコードを簡略化したときにエラーが発生しました。しかし、実際のコードの一部は、あなたが予測したように、 'E'を変更しようとしています。 (私の例では本当にそのうちの1つを入れておかなければなりませんでしたが、あなたはその例を見ずにそれを理解しました)私はコンテナの型に '' inと ''の異なる組み合わせを試みていましたが、それは実際にはこれらのジェネリック医薬品よりも高い注文であるため、そのどれも作用しません。 – sirksel
これをサポートする言語はごくわずかですが、実際にはJVMには1つあります:Scala。あなたはそれがオプションかどうかを検討するかもしれません。 –