我试图了解Scala特征和案例类。以下是this question的后续内容。
假设我有一个简单的类和一个扩展它的对象。
sealed trait Operations{
def add(a:Double,b:Double):Double
def multiply(a:Double,b:Double):Double
}
case object CorrectOperations extends Operations{
def add(a:Double,b:Double):Double = a+b
def multiply(a:Double,b:Double):Double= a*b
}
现在我有一些函数可以使用Operations
类型的任何对象,例如,
def doOperations(a:Double,b:Double, op:Operations)={ op.multiply(a,b) - op.add(a,b)}.
这很有效,但我的问题是如何推广特质Operations
的类型,因此我们不只是在谈论Doubles
。所以我想为trait Operations
设置泛型类型,然后为每个对象键入规范。
使用类型泛型,我试过
sealed trait Operations[T]{
def add(a:T,b:T):T
def multiply(a:T,b:T):T
}
case object CorrectOperations extends Operations[Double]{
def add(a:Double,b:Double):Double = a+b
def multiply(a:Double,b:Double):Double= a*b
}
def doOperations[T](a:T,b:T, op:Operations[T])={ op.multiply(a,b) - op.add(a,b) },
在doOperations
处编译错误 - "值 - 不是类型参数T"的成员。
因此我们知道op.multiply(a,b)
将返回类型T
,错误将表明类型T
没有.-
方法。
我应该如何考虑实现特质Operations
的这种概括?感谢
答案 0 :(得分:2)
在您的问题的上下文中,您应该在subtract
特征中引入Operations
方法,以便您可以提供T
具有此类方法的证据(以及它没有&# 39; t,但是从另一个减去T
的方法。
sealed trait Operations[T] {
def add(a: T, b: T): T
def multiply(a: T, b: T): T
def subtract(a: T, b: T): T
}
case object CorrectOperations extends Operations[Double]{
def add(a: Double, b: Double): Double = a + b
def multiply(a: Double, b: Double): Double = a * b
def subtract(a: Double, b: Double): Double = a - b
}
def doOperations[T](a: T, b: T, op: Operations[T]) =
op.subtract(op.multiply(a,b), op.add(a,b))
这基本上是Numeric特质的作用。
答案 1 :(得分:1)
您遇到的问题是类型类中没有-
(减号)操作从multiply
结果中减去add
结果,无效地查找该运算符输入T
。
尝试将minus
添加到您的类型类:
sealed trait Operations[T]{
def add(a:T,b:T):T
def multiply(a:T,b:T):T
def minus(a:T,b:T):T
}
def doOperations[T](a:T,b:T, op:Operations[T])=
op.minus(op.multiply(a,b) - op.add(a,b))