scala 宏中的 Lambda 导致 NoSuchMethodError 异常
Lambda in scala macros causes NoSuchMethodError exception
我是scala初学者,正在研究宏
正如我在标题中所说,当我将 lambda 传递给宏时,我得到了一个 NoSuchMethodError 异常。例如,下面会导致 NoSuchMethodError 异常。
object ShowGen {
def apply[T](f: T => String): Show[T] = macro impl_apply[T]
def impl_apply[T: c.WeakTypeTag](c: Context)(f: c.Expr[T => String]): c.Expr[Show[T]] = {
import c.universe._
val ty = c.weakTypeOf[T]
c.Expr[Show[T]](
q"""
new Show[$ty] {
override def show(t: $ty): String = $f(t)
}
""")
}
}
trait Show[T] {
def show(t: T): String
}
object Main extends App {
implicit val intShow: Show[Int] = ShowGen[Int] {
n => (n + 1).toString
}
implicit class ShowOps[T: Show](t: T) {
def show: String = implicitly[Show[T]].show(t)
}
println(1.show)
}
异常的堆栈跟踪是
[error] java.lang.NoSuchMethodError: Main$.$anonfun$intShow$adapted(Ljava/lang/Object;)Ljava/lang/String;
[error] at Main$$anon.show(Main.scala:3)
[error] at Main$$anon.show(Main.scala:2)
[error] at Main$ShowOps.show(Main.scala:7)
[error] at Main$.delayedEndpoint$Main(Main.scala:10)
[error] at Main$delayedInit$body.apply(Main.scala:1)
[error] at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error] at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error] at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error] at scala.App.$anonfun$main$adapted(App.scala:80)
[error] at scala.collection.immutable.List.foreach(List.scala:392)
[error] at scala.App.main(App.scala:80)
[error] at scala.App.main$(App.scala:78)
[error] at Main$.main(Main.scala:1)
[error] at Main.main(Main.scala)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] Nonzero exit code: 1
我的问题是如何防止此异常并在宏中使用 lambda。
我知道similar issue在github,但是那个issue没有回复,所以我无法通过issue解决
环境
java -version
:
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
scalaVersion
在 sbt 中:2.12.8
这是一个错误
适配函数初始化期间出现 NoSuchMethodError #10554 https://github.com/scala/bug/issues/10554
NoSuchMethodError $改编#10054 https://github.com/scala/bug/issues/10054
解决方法是使用命名函数:
val f: Int => String = n => (n + 1).toString
implicit val intShow: Show[Int] = ShowGen[Int](f)
implicit class ShowOps[T: Show](t: T) {
def show: String = implicitly[Show[T]].show(t)
}
println(1.show) // 2
我是scala初学者,正在研究宏
正如我在标题中所说,当我将 lambda 传递给宏时,我得到了一个 NoSuchMethodError 异常。例如,下面会导致 NoSuchMethodError 异常。
object ShowGen {
def apply[T](f: T => String): Show[T] = macro impl_apply[T]
def impl_apply[T: c.WeakTypeTag](c: Context)(f: c.Expr[T => String]): c.Expr[Show[T]] = {
import c.universe._
val ty = c.weakTypeOf[T]
c.Expr[Show[T]](
q"""
new Show[$ty] {
override def show(t: $ty): String = $f(t)
}
""")
}
}
trait Show[T] {
def show(t: T): String
}
object Main extends App {
implicit val intShow: Show[Int] = ShowGen[Int] {
n => (n + 1).toString
}
implicit class ShowOps[T: Show](t: T) {
def show: String = implicitly[Show[T]].show(t)
}
println(1.show)
}
异常的堆栈跟踪是
[error] java.lang.NoSuchMethodError: Main$.$anonfun$intShow$adapted(Ljava/lang/Object;)Ljava/lang/String;
[error] at Main$$anon.show(Main.scala:3)
[error] at Main$$anon.show(Main.scala:2)
[error] at Main$ShowOps.show(Main.scala:7)
[error] at Main$.delayedEndpoint$Main(Main.scala:10)
[error] at Main$delayedInit$body.apply(Main.scala:1)
[error] at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error] at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error] at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error] at scala.App.$anonfun$main$adapted(App.scala:80)
[error] at scala.collection.immutable.List.foreach(List.scala:392)
[error] at scala.App.main(App.scala:80)
[error] at scala.App.main$(App.scala:78)
[error] at Main$.main(Main.scala:1)
[error] at Main.main(Main.scala)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] Nonzero exit code: 1
我的问题是如何防止此异常并在宏中使用 lambda。
我知道similar issue在github,但是那个issue没有回复,所以我无法通过issue解决
环境
java -version
:
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
scalaVersion
在 sbt 中:2.12.8
这是一个错误
适配函数初始化期间出现 NoSuchMethodError #10554 https://github.com/scala/bug/issues/10554
NoSuchMethodError $改编#10054 https://github.com/scala/bug/issues/10054
解决方法是使用命名函数:
val f: Int => String = n => (n + 1).toString
implicit val intShow: Show[Int] = ShowGen[Int](f)
implicit class ShowOps[T: Show](t: T) {
def show: String = implicitly[Show[T]].show(t)
}
println(1.show) // 2