Я очень новичок в Scala.Scala: Ограничение по типу класса
Я хочу реализовать общий матричный класс класса Matrix [T] ". Единственным ограничением на T должно быть то, что T должен реализовать функцию «+» и «*» mothod /. Как мне это сделать?
Например, я хочу иметь возможность использовать как Int, Double, так и мои собственные определенные типы, например. Комплекс
Я думал что-то вдоль линий:
class Matrix[T <: MatrixElement[T]](data: Array[Array[T]]) {
def *(that: Matrix) = ..// code that uses "+" and "*" on the elements
}
abstract class MatrixElement[T] {
def +(that: T): T
def *(that: T): T
}
implicit object DoubleMatrixElement extends MatrixElement[Double]{
def +(that: Double): Double = this + that
def *(that: Double): Double = this * that
}
implicit object ComplexMatrixElement extends MatrixElement[Complex]{
def +(that: Complex): Complex = this + that
def *(that: Complex): Complex = this * that
}
всех проверки типа, но я до сих пор не могу создать экземпляр матрицы. Мне не хватает неявного конструктора? Как я могу это сделать? Или я совершенно ошибаюсь в своем методе?
Заранее спасибо Troels
Я считал Numeric. Но я действительно не вижу, как это будет работать для моих собственных типов, например. Сложный. Я бы подумал, что Complex тогда потребуется расширить Numeric. Что в первую очередь потребует от меня реализовать гораздо больше методов, чем просто + и *. Среди этих заказов - насколько я знаю, нет строгих заказов на комплексные числа. Ключевым моментом является то, что мне нужна матрица для работы над любыми типами, которые просто заполняют эти методы + и *. –
Существует множество методов для реализации, если вам нужны только + и *. Но вы все равно можете создать что-то вроде Numeric только с этими двумя методами. Это должно быть две работы. (И, возможно, вернитесь позже и замените его на числовое, если это стоит.) –
@troels Вы всегда можете заказать реальную часть или просто вернуть «0» для всех сравнений. И вы всегда можете «реализовать» методы с помощью 'error (« Undefined method »)'. Обратите внимание, однако, что 'Complex' не будет _extend_' Numeric'. Вместо этого будет экземпляр «Numeric [Complex]». –