2016-11-01 1 views
0

Я пытаюсь использовать пакет scala-reflection для разработки Android. Я добавил SCALA-отражает зависимость в моем build.sbt:sbt-android: не удалось использовать scala-reflect on android: java.rmi.Remote not found

libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.11.8" 

, но я получаю исключение:

java.lang.NoClassDefFoundError: Failed resolution of: Ljava/rmi/Remote; 
           at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass$lzycompute(Definitions.scala:370) 
           at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass(Definitions.scala:370) 
           at scala.reflect.runtime.JavaUniverseForce$class.force(JavaUniverseForce.scala:255) 
           at scala.reflect.runtime.JavaUniverse.force(JavaUniverse.scala:16) 
           at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:147) 
           at scala.reflect.runtime.JavaUniverse.<init>(JavaUniverse.scala:78) 
           at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17) 
           at scala.reflect.runtime.package$.universe(package.scala:17) 

Я пытался добавить источник Java в java.rmi.Remote и java.rmi.RemoteException и построили проект с android:package --core-library (потому что sbt не нашел параметр dexCoreLibrary), он был успешно создан, но я получил ошибку времени выполнения.

Итак, можно ли добавить зависимость java.rmi в противном случае, что scala.reflect может использовать его?

Я использую библиотеку scala.reflect в контексте реализации метода Option.orDefault:

class RichOption[+A : TypeTag](val delegate: Option[A]) { 

    def orDefault : A = delegate.getOrElse { 
    delegate match { 
     case t if typeOf[A] <:< typeOf[Int] => 0.asInstanceOf 
     case _ => throw new IllegalAccessException("there is no default value for this type.") 
    } 
    } 


} 

Если вы знаете лучше реализацию Option.orDefault (возможно без scala.reflect), пожалуйста, дай мне знать.

ответ

1

Намного лучше:

case class Default[A](value: A) 
object Default { 
    implicit val intDefault: Default[Int] = Default(0) 
    // other Default implementations 
} 

class RichOption[+A](val delegate: Option[A])(implicit d: Default[A]) { 
    def orDefault : A = delegate.getOrElse(d.value) 
} 

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

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