这实际上是 JVM 的限制,而不是 Scala 问题。这是 Java 中的一个类似示例:
public class ThisTest {
public final String name;
public ThisTest(String n) {
name = n;
}
public ThisTest() {
// trying to use `this` in a call to the primary constructor
this(this.getClass().getName());
}
}
当你尝试编译它时,你会得到一个错误:
$ javac ThisTest.java
ThisTest.java:10: error: cannot reference this before supertype constructor has been called
this(this.getClass().getName());
^
1 error
问题是您试图在调用任何超级构造函数this
之前进行引用。无论您使用哪种 JVM 语言,都将受到限制,即不能在 a或call 中使用引用,因为这是类在 JVM 上的工作方式。this
this
this
super()
this()
但是,您可以通过重构代码以在调用this
之后放置引用来完全避免此问题:this()
class A (numbers: Double) {
val logger = LoggerFactory.getLogger(this.getClass)
def this(numbersAsStr: String) = {
this ( try { numbersAsStr.toDouble } catch { case _ => 0 } )
LoggerFactory.getLogger(this.getClass).error("Failed to convert");
}
}
您实际上可能希望访问引发的异常以获取日志信息。在这种情况下,我只会使用LoggerFactory.getLogger(classOf[A])
. 如果您使用继承(我假设这里就是这种情况),那不会给您实际的类名,但是如果您在日志中包含堆栈跟踪,那么您应该能够弄清楚。