【问题标题】:Scala: How to make requirements of the type parametres of generic classes?Scala:如何对泛型类的类型参数提出要求?
【发布时间】:2010-12-02 18:22:47
【问题描述】:

我正在创建一些参数化类 C[T],并且我想对类型 T 的特性提出一些要求,以便能够成为我的类的参数。如果我只想说 T 继承自特征或类(就像我们对 Ordering 所做的那样),那将很简单。但我也希望它实现一些功能。

例如,我已经看到许多预定义类型实现了 MinValue 和 MaxValue,我希望我的类型 T 也实现这些。我收到了一些建议来定义一个隐式函数。但是我不希望所有用户在已经实现时都必须为这些用户实现此功能。我也可以在我的代码中实现它们,但这似乎只是一个糟糕的快速修复。

例如,在定义堆时,我想允许用户构造一个空堆。在这些情况下,我想用类型 T 可能具有的最小值来初始化值。显然这段代码不起作用。

class Heap[T](val value:T,val heaps:List[Heap[T]]){
    def this()=this(T.MinValue,List())
}

我也很想收到一些关于非常好的在线 Scala 2.8 参考的建议。

【问题讨论】:

标签: scala requirements parameterization


【解决方案1】:

一堆东西,由于共享一些方法(尽管返回类型不同)而松散地相关。对我来说,这听起来像是临时多态性!

滚动类型类...

class HasMinMax[T] {
  def maxValue: T
  def minValue: T
}

implicit object IntHasMinMax extends HasMinMax[Int] {
  def maxValue = Int.MaxValue
  def minValue = Int.MinValue
}

implicit object DoubleHasMinMax extends HasMinMax[Double] {
  def maxValue = Double.MaxValue
  def minValue = Double.MinValue
}

// etc

class C[T : HasMinMax](param : T) {
  val bounds = implicitly[HasMinMax[T]]
  // now use bounds.minValue or bounds.minValue as required
}

更新

[T : HasMinMax] 表示法是一个上下文绑定,是语法糖:

class C[T](param : T)(implicit bounds: HasMinMax[T]) {
  // now use bounds.minValue or bounds.minValue as required
}

【讨论】:

  • 这适用于正常功能。但是我在构造函数中使用它时遇到了麻烦......它说没有找到边界
  • 我在我的定义中添加了扩展,应该对你有用
【解决方案2】:

您可以使用类型边界:

trait Base

class C[T <: Base]

使C 可以使用T 的任何类型进行参数化,Base 的子类型。

或者你可以使用隐式参数来表达需求:

trait Requirement[T] {
  def requiredFunctionExample(t: T): T
}

class C[T](implicit req: Requirement[T])

因此,类C 的对象只有在您希望参数化的T 类型存在Requirement 特征的实现时才能构造。例如,您可以将不同类型 TRequirement 实现放在一个包对象中,从而在导入相应包时将它们纳入范围。

【讨论】:

  • 好的!但这不是我要找的。我不想在已经定义的特征中重新定义 MinValue 和 MaxValue。不仅如此,我希望 Int、Double、Char... 成为这些参数 T,但它们都没有扩展我正在创建的特征。
  • 问题是MinValueMaxValue对于IntChar,...的类型不一样,它们的签名不同,所以它们是不同的方法。这意味着您可能必须创建一个返回抽象方法的需求特征,例如,Any,然后为基本类型重新定义它。我希望我理解正确..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2015-08-21
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多