2017-01-11 5 views
0

Возможно ли создать собственные числовые типы, которые можно сравнить со встроенными scala числовыми типами и, возможно, использоваться в смешанной арифметике? Например, если предположитьСмешанная арифметика между настраиваемыми типами и встроенными номерами scala - возможно ли это?

class UnsignedInt(private val bits :Int) extends AnyVal { 
    ... 
} 

Могу ли я сделать его равным Int с? Хотя я могу определить def ==(that :Int) (который я думаю, не должно быть возможно), я не могу найти в любом случае, чтобы заставить преобразование так, что

val (s, u) = 1 -> new UnsignedInt(1) 
s == u 

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

ответ

0

Типичный способ сделать это в Scala - использовать неявное преобразование; this blog post объясняет это хорошо. Портирование эту идею в своем классе будет:

object UnsignedIntImplicits { 
    implicit def Int2UnsignedInt(value:Int) = new UnsignedInt(value) 
} 

Тогда не забудьте активировать его:

import UnsignedIntImplicits._