2016-03-30 2 views
0

Я пытаюсь придумать родовую функцию (toBitSet) с помощью параметра типа T.Типа в Scala с общей функцией

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 функции specializaton родового функции.

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, чтобы показать сообщение об ошибке. Я указал, что T является интегральным типом, но он не работает.

enter image description here

Как решить эту проблему?

+1

С таким объявлением вы вводите неявный параметр для своего метода типа «Интеграл [T]». Аналогом Scala для '' является '[T <: SomeType]' – Aliaxander

ответ

3

Тип подписи def func[T: Integral](arg: T) = {} на самом деле является синтаксическим сокращением для: (. «ЭВ» часто выбирают в качестве названия для этого «доказательства» аргумент) def func[T](arg: T)(implicit ev: Integral[T]) = {}

Integral trait описывает, какие операции вы затем использовать на элементы типа T. Пример: добавление ev.plus(t1, t2)

Если вы import Integral.Implicits._, то вы можете использовать более естественное инфиксное обозначение: t1 + t2

К сожалению, интегральная черта не включает в себя побитовые операции, как & и >>.

Если вы можете изменить свой алгоритм, чтобы использовать только доступные операционные системы, вы получите функцию, которой вы пользуетесь.

Смежные вопросы