可以说类型参数T必须具有特定的超类型S_1:
class Test[T <: S_1]
有没有办法说,一个类型参数必须至少有一个超类型的多个超类型备选方案? 像(伪代码)的东西:
class Test[T <: S_1 || S_2]
或者:这是不可能的,因为这样的结构毫无意义,并且会在代码中暗示设计错误吗?
答案 0 :(得分:9)
简答:直观的解决方案是让S_1
和S_2
分享一个共同的特征,代表您对类型参数{{1}所需的一组能力}。使用该特征作为T
的上限。
更多可能性:
如果T
和S_1
性质不相关,您对S_2
类型的要求是它有某些成员(T
和{{{ 1}}恰好实现),您可以使用structural type来制定(后面的概念称为duck typing)。
如果出于某种原因,您确实需要S_1
成为S_2
或T
的子类,并且您无法更改这些类型,则可以使用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