使用泛型函数

时间:2016-03-30 21:47:55

标签: scala generics polymorphism type-parameter

我试图使用类型参数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是积分类型,但它不起作用。

enter image description here

如何解决这个问题?

1 个答案:

答案 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. } 等逐位操作。

如果您可以修改算法以仅使用那些可用的操作,那么您将获得您之后的功能。