如何在Scala中为泛型类型指定泛型类型的绑定?

时间:2012-09-15 18:07:09

标签: scala generics bounds

这个问题是关于使用泛型类型和设置界限,所以请不要因为我使用的库而吓坏了。以此为例。

我使用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必须是Tensor的子类型,我知道我一直在使用Double,所以让它为Double,对于第一个类型的参数(K),从传递的参数中获取它。

它无法正常工作,因为我收到错误:

  

推断类型参数[Nothing,DenseVectorCol [Double]]不符合方法validate的类型参数bounds [K,T&lt;:Tensor [K,Double]]

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

1 个答案:

答案 0 :(得分:2)

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

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

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