怎么说类型参数必须有一个替代超类型的超类型?

时间:2012-06-17 22:13:06

标签: scala

可以说类型参数T必须具有特定的超类型S_1:

class Test[T <: S_1] 

有没有办法说,一个类型参数必须至少有一个超类型的多个超类型备选方案? 像(伪代码)的东西:

class Test[T <: S_1 || S_2] 

或者:这是不可能的,因为这样的结构毫无意义,并且会在代码中暗示设计错误吗?

2 个答案:

答案 0 :(得分:9)

简答:直观的解决方案是让S_1S_2分享一个共同的特征,代表您对类型参数{{1}所需的一组能力}。使用该特征作为T的上限。

更多可能性:

  • 如果TS_1性质不相关,您对S_2类型的要求是它有某些成员(T和{{{ 1}}恰好实现),您可以使用structural type来制定(后面的概念称为duck typing)。

  • 如果出于某种原因,您确实需要S_1成为S_2T的子类,并且您无法更改这些类型,则可以使用implicits进行转换这些都是新引入的内部类型S_1,您可以将其用作S_2的上限。

答案 1 :(得分:3)

让我扩展Niklas第二种选择。隐式参数可以用来证明关于类型的东西,所以这看起来就像是事情。它会是这样的:

class ThingIWantToProve[T]
object ThingIWantToProve {
  // Here I define the proofs I need
  implicit def s1IsProvable: ThingIWantToProve[S_1] = new ThingIWantToProve[S_1]
  implicit def s2IsProvable: ThingIWantToProve[S_2] = new ThingIWantToProve[S_2]
}
class Test[T : ThingIWantToProve] // here I use a context bound