我有一个类 Foo
定义如下:
class Elem[A]
abstract class BaseDef[T](implicit val selfType: Elem[T])
case class Foo[A, T]()(implicit val eA: Elem[A], val eT: Elem[T]) extends BaseDef[A]
令我惊讶的是,getDeclaredFields
确实不包含eA
:
object Test extends App {
private val fields = classOf[Foo[_, _]].getDeclaredFields
println(fields.mkString("\n"))
assert(fields.exists(_.getName == "eA"))
}
产生
private final scalan.Elem scalan.Foo.eT
Exception in thread "main"
java.lang.AssertionError: assertion failed
at scala.Predef$.assert(Predef.scala:151)
at scalan.Test$.delayedEndpoint$scalan$Test$1(JNIExtractorOps.scala:15)
at scalan.Test$delayedInit$body.apply(JNIExtractorOps.scala:11)
对此有解释还是这是一个已知的错误(Scala 版本是 2.11.7)?我可以从类外部访问eA
。
编译器似乎决定可以为 eA
重用 selfType
字段,如果它不会中断对 eA
的访问,那就太好了在 scala-reflect 中。
最佳答案
Reply from Jason Zaugg on scala-user :
The compiler avoids redundant fields in subclasses if it statically determines that the value is stored in a field in a super class that exposes it via an accessible accessor.
To prevent this, you might be able to change the superclass constructor by removing the val keyword and add another val to that class that stores the parameter.
关于scala - 当父类(super class)中存在具有相同类型的隐式 val 时,编译器不会生成隐式 val 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32118877/