sbt-android: 无法在 android 上使用 scala-reflect: java.rmi.Remote 未找到
sbt-android: unable to use scala-reflect on android: java.rmi.Remote not found
我正在尝试使用 scala-reflect 包进行 android 开发。
我在 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.rmi.Remote
和 java.rmi.RemoteException
的 java 源并使用 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),请告诉我。
好多了:
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)
}
如果与没有定义的默认值、没有复杂匹配、不需要大依赖等的类型一起使用,您会得到编译错误而不是运行时错误。
我正在尝试使用 scala-reflect 包进行 android 开发。 我在 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.rmi.Remote
和 java.rmi.RemoteException
的 java 源并使用 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),请告诉我。
好多了:
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)
}
如果与没有定义的默认值、没有复杂匹配、不需要大依赖等的类型一起使用,您会得到编译错误而不是运行时错误。