我正试图了解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
- "value - is not a member of type parameter T" .
所以我们知道 op.multiply(a,b)
将返回 T
类型,并且错误将指示类型 T
没有 .-
方法 .
我应该如何考虑实现这种特质的推广 Operations
?谢谢
2 回答
在您的问题的上下文中,您应该在
Operations
特征中引入一个subtract
方法,以便您可以提供T
具有此类方法的证据(好吧它没有,但是从另一个方法减去T
的方法) .这基本上就是Numeric特质所做的 .
您遇到的问题是类型类中没有
-
(减号)操作从add
结果中减去multiply
结果,在T
类型上无效地查找该运算符 .尝试将
minus
添加到您的类型类: