6

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

class Test[T <: S_1] 

有没有办法说一个类型参数必须至少有多个超类型替代的超类型?类似(伪代码):

class Test[T <: S_1 || S_2] 

或者:这不可能吗,因为这样的构造没有意义,并且会暗示代码中的设计错误?

4

2 回答 2

9

简短回答:直观的解决方案是创建S_1S_2共享一个共同特征,该特征代表您对类型参数所需的能力集T。使用该特征作为 的上限T

更多可能性:

  • 如果S_1S_2本质上不相关,并且您对类型的要求T是它具有某些成员(两者都S_1实现S_2),您可以使用结构类型来制定它(背后的概念称为鸭子类型)。

  • 如果由于某种原因您确实需要T成为S_1or的子类S_2,并且您无法更改这些类型,则可以使用隐式将这两者都转换为新引入的内部类型S_1_or_2,然后您可以将其用作您的上限T.

于 2012-06-17T22:18:34.143 回答
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
于 2012-06-18T00:49:49.173 回答