0

Android 開発に scala-reflect パッケージを使用しようとしています。build.sbt に scala-reflect 依存関係を追加しました。

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としましたが(sbt が dexCoreLibrary オプションを見つけられなかったため)、正常にビルドされましたが、実行時エラーが発生しました。java.rmi.RemoteExceptionandroid:package --core-library

そうでなければ、scala.reflect がそれを使用できるように、java.rmi 依存関係を追加することは可能ですか?

メソッド Option.orDefault の実装のコンテキストで scala.reflect ライブラリを使用しています。

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 なし) を知っている場合は、お知らせください。

4

1 に答える 1

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)
}

デフォルト値が定義されていない、複雑なマッチングがない、大きな依存関係が必要ないなどの型で使用すると、実行時エラーではなくコンパイル エラーが発生します。

于 2016-11-01T20:08:15.280 に答える