【问题标题】:How to say that a type parameter must have one supertype of alternative supertypes?怎么说一个类型参数必须有一个超类型的替代超类型?
【发布时间】:2012-06-19 23:19:54
【问题描述】:

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

class Test[T <: S_1] 

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

class Test[T <: S_1 || S_2] 

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

【问题讨论】:

  • 你能举个例子说明如何使用它吗?您是否考虑过这样一种情况:参数类型为 T 的对象只会使用恰好在不相关类型 S_1S_2 中具有相同签名的方法?
  • 你要找的是联合类型;看到这个问题:stackoverflow.com/q/3508077/770361

标签: scala


【解决方案1】:

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

更多可能性:

    1234563使用structural type 来表述(背后的概念称为duck typing)。 1234563引入了内部类型S_1_or_2,然后您可以将其用作T 的上限。

【讨论】:

    【解决方案2】:

    让我扩展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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多