scala - 当父类(super class)中存在具有相同类型的隐式 val 时,编译器不会生成隐式 val 的字段

标签 scala reflection scala-2.11

我有一个类 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/

相关文章:

java - 如何从 .java 文件中获取方法列表

java - 有什么好方法可以让两个不可变对象(immutable对象)互相引用?

java - 如何重定向到在 play 框架中有 post 方法的 Action

json - 为什么这个 json4s 代码在 scala repl 中工作但无法编译?

swing - 如何在 Scala 的 Swing 表中嵌入(工作)按钮?

postgresql - 如何将更新集 SQL 转换为 scala quill?

java - 无法无异常地修改私有(private)最终静态变量

scala - 从 Scala 中的 MethodMirror 实例获取方法的函数类型

mysql - Playframework 2.5 Slick + DI

scala - 用于理解时递归调用不在尾部位置