[英]Single Abstract Method Equivalent to a Trait?
考虑以下特征:
trait Foo {
def m1(id : Int) : Try[String]
}
并举例说明:
val g : Foo = new Foo {
override def m1(id: Int): Try[String] = Success("Good job")
}
Intellij建议将其转换为单一抽象方法:
val g : Foo = (id: Int) => Success("Good job")
这两个等效吗?
让我们检查一下scalac
作用:
import scala.util.{Success, Try}
trait Foo {
def m1(id : Int) : Try[String]
}
object MainClass {
val g : Foo = new Foo {
override def m1(id: Int): Try[String] = Success("Good job")
}
}
跑:
$ scalac -print src/main/scala/MainClass.scala
并输出:
[[syntax trees at end of cleanup]] // MainClass.scala
package <empty> {
abstract trait Foo extends Object {
def m1(id: Int): scala.util.Try
};
object MainClass extends Object {
private[this] val g: Foo = _;
<stable> <accessor> def g(): Foo = MainClass.this.g;
def <init>(): MainClass.type = {
MainClass.super.<init>();
MainClass.this.g = {
new <$anon: Foo>()
};
()
}
};
final class anon$1 extends Object with Foo {
override def m1(id: Int): scala.util.Try = new scala.util.Success("Good job");
def <init>(): <$anon: Foo> = {
anon$1.super.<init>();
()
}
}
}
并对以下步骤执行相同的步骤:
import scala.util.{Success, Try}
trait Foo {
def m1(id : Int) : Try[String]
}
object MainClass {
def main(args: Array[String]): Unit = {
val g : Foo = (id: Int) => Success("Good job")
}
}
跑:
$ scalac -print src/main/scala/MainClass.scala
输出:
[[syntax trees at end of cleanup]] // MainClass.scala
package <empty> {
abstract trait Foo extends Object {
def m1(id: Int): scala.util.Try
};
object MainClass extends Object {
private[this] val g: Foo = _;
<stable> <accessor> def g(): Foo = MainClass.this.g;
final <artifact> private[this] def $anonfun$g$1(id: Int): scala.util.Try = new scala.util.Success("Good job");
def <init>(): MainClass.type = {
MainClass.super.<init>();
MainClass.this.g = {
((id: Int) => MainClass.this.$anonfun$g$1(id))
};
()
}
}
}
如您所见,它们对于编译器而言是不同的。
在第一种情况下,它是一个匿名对象,其次是一个匿名函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.