这个问题是关于使用泛型类型和设置界限,所以请不要因为我使用的库而 panic 。以此为例。
我使用 Scalala 并使用此类类型 DenseMatrix[V]
、DenseVectorCol[V]
和 DenseVectorRow[V]
。它们的常见父类(super class)型是 Tensor[K,V]。请注意,Tensor
有附加参数 K
- 所有提到的类 Dense...
都设置此类型 K
他们自己。
所以我想编写一个带有参数的方法,其上限类型为Tensor
。我为我的方法编写了这样的代码:
def validate[K,T <: Tensor[K,Double]](tensor : T) : T = ...
出于这样的意图 - T
必须是 Tensor
的子类型,而且我知道我一直在使用 Double
,所以让它为Double
,对于第一个类型参数(K
),从传递的参数中获取它。
它没有按我的预期工作,因为我收到错误:
inferred type arguments [Nothing,DenseVectorCol[Double]] do not conform to method validate's type parameter bounds [K,T <: Tensor[K,Double]]
问题:那么如何从传递的参数中提取这种类型K
?
最佳答案
如果你根本不关心K
,你可以使用通配符:
def validate[T <: Tensor[_, Double]]: T = ...
请注意,在某些情况下这不起作用(例如,如果您需要返回 K
或以其他方式在方法中使用它),但假设这不是其中一种情况,这是一个完全有效的解决方案,类型推断效果很好。
关于scala - 如何在 Scala 中使用泛型类型指定泛型类型的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439825/