我想要得到斯卡拉特质和案例类的挂钩。以下是对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
。所以我想为特征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
这个特征的泛化?由于
+1提的数字。另外,看看Numeric如何添加Ops类以让您使用'-'而不是'subtract' –