Конвертировать Option [Object] в Option [Int] неявно - PullRequest
1 голос
/ 20 марта 2010

Я работаю с устаревшим кодом Java, который возвращает java.lang.object. Я передаю его в функцию, и я хотел бы сделать некоторые неявные преобразования как таковые:

implicit def asInt( _in:Option[Object] ) = _in asInstanceOf[ Option[Int] ]
implicit def asDouble( _in:Option[Object] = _in asInstanceOf[ Option[Double] ]

private def parseEntry( _name:String, _items:Map[String,Object] ) = _name match{
    case docName.m_Constants =>
        new Constants( _items get( Constants m_Epsilon ), _items get( Constant m_Rho ),
                       _items get( Constants m_N ) )

Технически это продолжается, но я продолжаю получать те же ошибки: ожидаемый Int, Option [Object] найден. Здесь сфокусированный снимок проблемы:

private def foo( _items:Map[String,Object] ) ={
    val bar:Option[Int] = _items get( "Bar" ) }

Как я сделал мои выводы неправильно? Я надеялся, что это сделает преобразование для меня, вместо того, чтобы мне каждый раз приходилось писать asInstanceOf.

1 Ответ

2 голосов
/ 20 марта 2010

Ваше неявное преобразование не применяется, потому что ваше неявное преобразование преобразует 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-карты, это объясняет разрыв здесь.

...