滥用Scala或Eclipse Bug使用Implicits

时间:2011-01-20 02:03:01

标签: scala

我在下面定义了一个类:

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

我有一个创建并返回新NDArray的对象:

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

我收到以下错误: 构造函数NDArray没有足够的参数:(隐式num:Numeric [A])com.numscal.matrix.NDArray [A]。未指定的值参数num。

我尝试在创建NDArray的对象中导入Numeric,但这不起作用。我对NDArray的单元测试不会导入数字,它们没有任何问题。

我对发生了什么很困惑。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

dataT类型列表的列表。 NDArray的构造函数需要类型为Numeric[T]的对象。因为该参数声明为implicit,这意味着当编译器可以在当前可见范围内找到一个也被定义为implicit时,您不需要显式指定一个参数。

现在,由于您创建了NDArray的实例而未指定T,因此编译器会推断T。它找到列表列表,并使用内部列表的元素类型T。但由于您没有指定一个且列表为空,因此默认为List[Nothing],因此,编译器断定TNothing类型。

然后它会搜索implicit Numeric[Nothing]的{​​{1}}实例,但这不存在。

你可以做几件事。之一:

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

或者:

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

(虽然我不确定最后一个是否会起作用。我不知道编译器是否会正确推断内部列表的类型参数;你只需要尝试它。)

implicit Numeric[Int]实例已默认导入,因为它是Predef的一部分。您无需显式导入它。所有原始数字类型都是如此。

我不知道您是否要使用整数列表,浮点数或其他内容。编译器也不知道,也无法推断,因为你给出的列表是空的。

答案 1 :(得分:2)

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

Nothing没有隐含的数字,请使用List.empty[List[TypeYouNeed]]