2

这个问题是关于使用泛型类型和设置边界的,所以请不要因为我使用的库而吓坏了。把它当作一个例子。

我使用 Scalala 并使用此类类型DenseMatrix[V]DenseVectorCol[V]并且DenseVectorRow[V]. 他们常见的超类型是Tensor[K,V]. 请注意,Tensor有附加参数K——所有提到的类都自己Dense...设置了这个类型K

所以我想写一个方法,其参数上限是Tensor. 我为我的方法编写了这样的代码:

def validate[K,T <: Tensor[K,Double]](tensor : T) : T = ...

有这样的意图——T必须是 s 的子类型Tensor,而且我知道我Double一直在使用 s ,所以让它成为Double,并且对于第一个类型参数 ( K) 从传递的参数中获取它。

它没有按我的预期工作,因为我收到错误:

推断的类型参数 [Nothing,DenseVectorCol[Double]] 不符合方法 validate 的类型参数边界 [K,T <: Tensor[K,Double]]

问题:那么如何K从传递的参数中提取这种类型?

4

1 回答 1

2

如果您根本不关心K,可以使用通配符:

def validate[T <: Tensor[_, Double]]: T = ...

请注意,在某些情况下这不起作用(例如,如果您需要在K方法中返回或以其他方式使用它),但假设这不是其中一种情况,这是一个完全有效的解决方案,并且类型推断将工作得很好。

于 2012-09-15T23:47:50.490 回答