我正在尝试在 Scala 中做一些我不确定是否可行的事情。我希望得到社区的一些反馈。
假设我对某些“事物”有一个密封的特征,它的一些具体扩展,以及一个与该特征的某些实现一起使用的泛型类..
sealed trait Thing
class CoolThing extends Thing
class OtherThing extends Thing
class BoxOfThings[T <: Thing]
现在,我可以定义另一个类来处理两个“盒子”,就像这样..
class PairOfBoxes(boxOne: BoxOfThings[_ <: Thing], boxTwo: BoxOfThings[_ <: Thing])
但是,在这里PairOfBoxes
用一个CoolThing
s 和另一个OtherThing
s 来创建 a 是完全可以的。我想声明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
断言它的参数是相同类型的无类型是理想的。
可能的?
谢谢!