我试图使用类型参数T来提出泛型函数(toBitSet)。
def toBitSet[T:Integral](x:T, valueBitwidth:Int, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = {
BitSet((for (i <- 0 to (valueBitwidth - 1) if (((x & 0xFF) >> i) & 1) == 1) yield (i + shift)): _*)
}
byteToBitSet和shortToBitSet函数是泛型函数的特殊功能。
def byteToBitSet(x:Byte, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = {
toBitSet[Byte](x = x, valueBitwidth = 8, filterBitwidth = filterBitwidth, bigEndian = bigEndian, shift = shift)
}
def shortToBitSet(x:Short, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = {
toBitSet[Short](x = x, valueBitwidth = 16, filterBitwidth = filterBitwidth, bigEndian = bigEndian, shift = shift)
}
但是,Scala并不了解类型T上的运算符(&gt;&gt;,&amp;,==,+)以显示错误消息。我指定T
是积分类型,但它不起作用。
如何解决这个问题?
答案 0 :(得分:3)
类型签名
def func[T](arg: T)(implicit ev: Integral[T]) = {}
实际上是一个语法简写:
T
(&#34; ev&#34;经常被选为此&#34;证据&#34;参数的名称。)
Integral trait概述了您对类型ev.plus(t1, t2)
的元素使用的操作。示例:添加为import Integral.Implicits._
如果您t1 + t2
,那么您可以使用更自然的中缀表示法:&
不幸的是,Integral特征不包括>>
和if (inputName.length() > 12) {
inputName.
}
等逐位操作。
如果您可以修改算法以仅使用那些可用的操作,那么您将获得您之后的功能。