Я пытаюсь получить висячие черты Scala и классы case. Ниже приведено описание для this question.scala value не является членом типа параметр
Предположим, у меня есть простой класс и объект, который его расширяет.
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
- «значение - не является членом параметра типа Т».
Таким образом, мы знаем, что op.multiply(a,b)
вернет тип T
, и ошибка будет указывать, что тип T
не имеет метода .-
.
Как я должен думать о достижении этого обобщения черты Operations
? Благодаря
+1 за упоминание Numeric. Кроме того, посмотрите, как Numeric добавляет класс Ops, чтобы вы могли использовать '-' вместо' subtract' –