【问题标题】:Scala advanced features noMethodException when being called from java (Minecraft)从 java (Minecraft) 调用时,Scala 高级功能 noMethodException
【发布时间】:2018-01-12 19:30:23
【问题描述】:

我使用的是 Scala 版本 2.12.4 和 sbt 版本 1.0.4。

我正在使用 Scala 中的海绵 API 为我的世界编写插件,但每次启动插件时,我总是得到:

java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
        at permissions.Permission.<init>(Permissions.scala:3) ~[Permission.class:0.1]
        at permissions.Permissions$.<init>(Permissions.scala:6) ~[Permissions$.class:0.1]
        at permissions.Permissions$.<clinit>(Permissions.scala) ~[Permissions$.class:0.1]

其中每个权限都是一个案例类:

case class Permission(node: String)

object Permissions {
  val examplePerm: Permission = Permission("pixelmcutils.permission.enable")

PS:尝试使用简单的 for 循环或任何隐式类时会出现类似的错误。

有人知道如何解决这个问题吗?

编辑:通过在 jar 中包含 scala 标准库来解决。

【问题讨论】:

  • 部署时是否包含 Scala 库 jar?
  • 我使用了 sbt 程序集,但是刚刚将 scala 库添加到了 fat jar 中并且它可以工作:)

标签: java scala sbt


【解决方案1】:

如果要创建不带new关键字的对象,需要在伴生对象(object Permissions)中实现apply方法

object Permissions {
  val examplePerm: Permission = Permission("pixelmcutils.permission.enable")
  def apply(node: String): Permission = {
     new Permissions(node)
  }

}

【讨论】:

  • 不是只适用于类和案例类吗?
  • Apply 是同伴不使用新关键字的特殊方法。或许您也可以将此方法添加到类中。
  • 它似乎没有解决问题:(
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多