scala 值不是类型参数的成员
scala value is not a member of type parameter
我正在尝试掌握 Scala 特性和案例 classes。以下是 .
的跟进
假设我有一个简单的 class 和一个扩展它的对象。
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
- "value - is not a member of type parameter T" 处出现编译错误。
所以我们知道 op.multiply(a,b)
将 return 键入 T
,并且错误将指示类型 T
没有 .-
方法。
我应该如何考虑实现这种特质 Operations
的概括?谢谢
在你的问题的上下文中,你应该在你的 Operations
特征中引入一个 subtract
方法,这样你就可以提供证据表明 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 特性的作用。
您 运行 遇到的问题是您的类型 class 中没有 -
(减号)操作可以从 [=] 中减去 multiply
结果13=] 结果毫无结果地在类型 T
.
上寻找该运算符
尝试将 minus
添加到您的类型 class:
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))
我正在尝试掌握 Scala 特性和案例 classes。以下是
假设我有一个简单的 class 和一个扩展它的对象。
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
- "value - is not a member of type parameter T" 处出现编译错误。
所以我们知道 op.multiply(a,b)
将 return 键入 T
,并且错误将指示类型 T
没有 .-
方法。
我应该如何考虑实现这种特质 Operations
的概括?谢谢
在你的问题的上下文中,你应该在你的 Operations
特征中引入一个 subtract
方法,这样你就可以提供证据表明 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 特性的作用。
您 运行 遇到的问题是您的类型 class 中没有 -
(减号)操作可以从 [=] 中减去 multiply
结果13=] 结果毫无结果地在类型 T
.
尝试将 minus
添加到您的类型 class:
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))