Как использовать Scala 2.10 неявные классы
Я думал, что это будет правильное использование новых неявных классов Scala 2.10:
implicit case class IntOps(i: Int) extends AnyVal {
def twice = i * 2
}
11.twice
По-видимому, нет:
<console>:13: error: value twice is not a member of Int
11.twice
^
Я что-то пропустил (Scala 2.10.0-M6)?
Ответы
Ответ 1
Ключ - это обессоливание неявных классов, объясняемое в SIP-13:
implicit class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}
будет преобразован компилятором следующим образом:
class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}
implicit final def RichInt(n: Int): RichInt = new RichInt(n)
Как вы можете видеть, неявная функция, созданная, имеет то же имя, что и исходные классы. Я предполагаю, что это сделано так, чтобы упростить импорт неявных классов.
Таким образом, когда вы создаете неявный класс case, существует конфликт между именем метода, созданным ключевым словом implicit
и сопутствующим объектом, созданным ключевым словом case
.
Ответ 2
Это показывает, что существует двусмысленность:
val ops: IntOps = 11
<console>:11: error: ambiguous reference to overloaded definition,
both method IntOps of type (i: Int)IntOps
and object IntOps of type IntOps.type
match argument types (Int) and expected result type IntOps
val ops: IntOps = 11
^
Не уверен, что именно происходит. Но если вы не используете case class
, это выглядит нормально:
implicit class IntOps(val i: Int) extends AnyVal {
def twice = i * 2
}
11.twice // ok