0

我已经阅读了关于从伴随类继承的对象的问题。

例如:

但我有一点不同的问题(我不确定这是一个错误)

我有以下代码:

class Scala(name: String)

import Scala._

object Scala extends Scala(TEST_NAME){
  val TEST_NAME = "test name"
}

请注意,我使用的是在伴随对象范围内定义的变量,然后将其传递给 super 的构造函数。

我收到以下编译错误:

Scala.scala:5: error: super constructor cannot be passed a self reference 
unless parameter is declared by-name

object Scala extends Scala(TEST_NAME){
                           ^
one error found

我尝试过的其他变体:

按姓名呼叫:

class Scala(name: => String)

import Scala._

object Scala extends Scala(TEST_NAME){
  val TEST_NAME = "test name"
}

命名参数:

class Scala(name: String)

import Scala._

object Scala extends Scala(name = TEST_NAME){
  val TEST_NAME = "test name"
}

两个都:

class Scala(name: => String)

import Scala._

object Scala extends Scala(name = TEST_NAME){
  val TEST_NAME = "test name"
}

一些环境细节:

  • 爪哇: java version "1.8.0_144"
  • 爪哇:javac 1.8.0_144
  • 斯卡拉:Scala code runner version 2.12.3
  • 斯卡拉克:Scala compiler version 2.12.3
  • 操作系统:Darwin ***.local 17.0.0 Darwin Kernel Version 17.0.0: Thu Aug 24 21:48:19 PDT 2017; root:xnu-4570.1.46~2/RELEASE_X86_64 x86_64

更新:

对于有兴趣解决此问题的任何人:

4

3 回答 3

2

对于您的受限用例:

scala> class C(s: String) ; object X extends C(X.x) { final val x = "hello, world" }
defined class C
defined object X

常量值定义是内联的(根据规范)。

于 2017-10-09T05:14:45.250 回答
1

您可以使用将在 Scala 3 中删除的晦涩功能:早期初始化程序。它允许您在调用超类构造函数之前指定要运行的初始化代码。

class Scala(name: String)

object Scala extends {
  val TEST_NAME: String = "test name"
} with Scala(TEST_NAME) { /* rest of object code */ }

请注意,不需要导入 -TEST_NAME已经在范围内。


这是一个Scastie 片段来证明它有效。

于 2017-10-03T16:38:43.680 回答
0

如果您上面的代码可以编译,那么您可以编写

class A(val x: String)

object B extends A(B.x_again) {

  val x_again = x
}

这当然看起来不太好。

于 2017-10-03T15:37:23.713 回答