Ваше неявное преобразование не применяется, потому что ваше неявное преобразование преобразует Option[Object]
в Option[Int]
, но, похоже, ваш код ожидает его преобразования Object
в Option[Int]
.
Попробуйте обернуть _items get( "Bar" )
Some()
, чтобы получить Option[Object]
вместо Object
и посмотреть, сработает ли ваше неявное преобразование.
РЕДАКТИРОВАТЬ: На самом деле, я не уверен, почему это не работает для вас, учитывая, что (как вы правильно указали в своем комментарии), Scala карты возвращают опции. Следующий код работает для меня и печатает «37», как я и ожидал:
import scala.collection.mutable.Map
import scala.collection.mutable.HashMap
object ImplicitConversions {
implicit def asInt( _in:Option[Object] ) = _in.asInstanceOf[Option[Int]]
implicit def asDouble( _in:Option[Object] ) = _in.asInstanceOf[Option[Double]]
private def foo( _items:Map[String,Object] ) = {
val bar:Option[Int] = _items.get("Bar")
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
Тем не менее, если я использую карты Java, то перенос с Some()
работает:
import java.util.Map
import java.util.HashMap
object ImplicitConversions {
implicit def asInt( _in:Option[Object] ) = _in.asInstanceOf[Option[Int]]
implicit def asDouble( _in:Option[Object] ) = _in.asInstanceOf[Option[Double]]
private def foo( _items:Map[String,Object] ) = {
val intermediate = Some(_items.get("Bar"))
val bar:Option[Int] = intermediate
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
(Обратите внимание, что мне нужно было сохранить результат Some()
в промежуточной переменной, чтобы получить преобразование в работу - Возможно, кто-то более опытный в Scala мог бы показать мне, как избежать этого промежуточного шага. ;-))
Возможно ли, что карты Scala и Java смешиваются в вашем коде? Вы действительно сказали, что обращаетесь к унаследованному Java-коду, поэтому вам пришлось сначала выполнить все это неявное преобразование. Если вы используете Java-карты, когда вы думаете, что используете Scala-карты, это объясняет разрыв здесь.