私はScalaで何かをしようとしていますが、それが可能かどうかはわかりません。コミュニティからのフィードバックをお待ちしています。
いくつかの「もの」の封印された特性、それのいくつかの具体的な拡張、およびその特性のいくつかの実装で機能するジェネリッククラスがあるとします。
sealed trait Thing
class CoolThing extends Thing
class OtherThing extends Thing
class BoxOfThings[T <: Thing]
これで、2つの「ボックス」を処理する別のクラスを定義できます。
class PairOfBoxes(boxOne: BoxOfThings[_ <: Thing], boxTwo: BoxOfThings[_ <: Thing])
PairOfBoxes
ただし、ここでは、1つのボックスともう1つのボックスを使用してを作成することはまったく問題CoolThing
ありOtherThing
ません。私はそれを宣言し、同じタイプの..boxOne
を含みたいのですが、それは可能ですか?boxTwo
Thing
例えば:
// Cool things..
val boxOfCoolThings = new BoxOfThings[CoolThing]
val anotherBoxOfCoolThings = new BoxOfThings[CoolThing]
// Other things..
val boxOfOtherThings = new BoxOfThings[OtherThing]
// A pair of cool boxes, no problem:
new PairOfBoxes(boxOfCoolThings, anotherBoxOfCoolThings)
// A pair of different boxes, compiles but I don't want it to:
new PairOfBoxes(boxOfOtherThings, anotherBoxOfCoolThings)
PairOfBoxes
このように、ジェネリック自体を作成することでこれを行うことができます。
class TypedPairOfBoxes[T <: BoxOfThings[_ <: Thing]](boxOne: T, boxTwo: T)
動作しますが、醜いです。
// A pair of cool boxes, no problem:
new TypedPairOfBoxes[BoxOfThings[CoolThing]](boxOfCoolThings, anotherBoxOfCoolThings)
// A pair of different boxes, doesn't compile:
val mixedPair = new TypedPairOfBoxes[BoxOfThings[CoolThing]](boxOfOtherThings, anotherBoxOfCoolThings)
私はこれを避けたいと思います。問題を上流に押し出し、それぞれの内容を指定するように強制しますTypedPairOfBoxes
。PairOfBoxes
パラメータが同じタイプであると主張する型なしを単純に使用することが理想的です。
可能?
ありがとう!