0

私は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を含みたいのですが、それは可能ですか?boxTwoThing

例えば:

// 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)

私はこれを避けたいと思います。問題を上流に押し出し、それぞれの内容を指定するように強制しますTypedPairOfBoxesPairOfBoxesパラメータが同じタイプであると主張する型なしを単純に使用することが理想的です。

可能?

ありがとう!

4

2 に答える 2