2011-01-20 2 views
0

У меня есть класс, определяемые ниже:Неправомерное Scala или Eclipse, использование ошибка Implicits

class NDArray[T](data: List[List[T]])(implicit num: Numeric[T]) 
..... 

Я объект, который создает и возвращает новый NDArray:

object Foo 
{ 
    def apply() = 
    { 
     new NDArray(List(List()) 
    } 
} 

Я получаю следующее error: Недостаточно аргументов для конструктора NDArray: (неявное число: числовое [A]) com.numscal.matrix.NDArray [A]. Неопределенный параметр значения num.

Я попытался импортировать Numeric в объект, который создает NDArray, но это не работает. Мои юнит-тесты для NDArray не импортируют Numeric, и у них нет никаких проблем.

Я смущен относительно того, что происходит. Есть идеи?

+0

Может быть проблема с тем, что объект находится в другой упаковке, чем класс? –

ответ

2
scala> List(List()) 
res19: List[List[Nothing]] = List(List()) 

Там нет неявной Числовой для Nothing, используйте List.empty[List[TypeYouNeed]]

+0

Ok ... Теперь давайте изменим это на List (List (1,2,3)) - Моя ошибка, я не видел, что я оставил ее пустой. –

4

data список списков типа T. Для конструктора NDArray требуется объект типа Numeric[T]. Поскольку этот параметр объявлен implicit, это означает, что вам не нужно указывать его явно, когда компилятор может найти его в видимой в настоящее время области, которая также была определена как implicit.

Теперь, поскольку вы создаете экземпляр NDArray без указания T, компилятор сообщает T. Он находит список списков и использует тип элемента внутреннего списка как T. Но поскольку вы не указали, что один и список пуст, по умолчанию это List[Nothing], поэтому компилятор заключает, что T - это тип Nothing.

Затем он ищет implicit экземпляр Numeric[Nothing], но этого не существует.

Есть несколько вещей, которые вы можете сделать. Либо:

new NDArray(List(List[Int]())) 

Или:

new NDArray[Int](List(List())) 

(Хотя я не уверен, что последний из них сработает, я не знаю, если компилятор будет считать параметр типа внутреннего списка. правильно, вам просто нужно попробовать.)

Номер implicit экземпляра Numeric[Int] уже импортирован по умолчанию, так как он является частью Predef. Вам не нужно явно импортировать его. То же самое относится ко всем примитивным числовым типам.

Я не знаю, хотите ли вы использовать список списков целых чисел, или плавать, или что-то еще. Компилятор тоже не знает, и он не может сделать вывод, потому что список, который вы указали, пуст.

+0

Это имеет смысл. Я вижу некоторые вещи, которые мне нужно изменить в моем коде. спасибо за подробный ответ. –

Смежные вопросы