我在下面定义了一个类:
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的单元测试不会导入数字,它们没有任何问题。
我对发生了什么很困惑。有什么想法吗?
答案 0 :(得分:4)
data
是T
类型列表的列表。 NDArray
的构造函数需要类型为Numeric[T]
的对象。因为该参数声明为implicit
,这意味着当编译器可以在当前可见范围内找到一个也被定义为implicit
时,您不需要显式指定一个参数。
现在,由于您创建了NDArray
的实例而未指定T
,因此编译器会推断T
。它找到列表列表,并使用内部列表的元素类型T
。但由于您没有指定一个且列表为空,因此默认为List[Nothing]
,因此,编译器断定T
是Nothing
类型。
然后它会搜索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]]