作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一些参数化类 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 引用的建议。
最佳答案
一堆东西,由于共享一些方法(尽管返回类型不同)而松散地相关。对我来说,这听起来确实像是临时多态性!
滚动类型类...
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]
表示法是一个上下文绑定(bind),是语法糖:
class C[T](param : T)(implicit bounds: HasMinMax[T]) {
// now use bounds.minValue or bounds.minValue as required
}
关于Scala:如何对泛型类的类型参数提出要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338398/
我是一名优秀的程序员,十分优秀!