【发布时间】:2017-10-03 15:02:59
【问题描述】:
我已经阅读了有关从伴随类继承的对象的问题。
例如:
- Class constructor parameter with default value causes companion object initializer to fail
- super constructor cannot be passed a self reference unless parameter is declared by-name
但我有一点不同的问题(我不确定这是一个错误)
我有以下代码:
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:
java version "1.8.0_144" - javac:
javac 1.8.0_144 - 斯卡拉:
Scala code runner version 2.12.3 - scalac:
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
更新:
对于有兴趣解决此问题的任何人:
【问题讨论】:
-
我认为陪伴在这里没有任何作用
-
@EduardoParejaTobes 你的意思是不需要陪伴,是吗?
-
是的,这类似于stackoverflow.com/q/32203867/614394,但用于值。我认为这对类型来说很好,对值来说是错误的:)
-
这样的好伙伴是有道理的。例如:
scala.util.Random。或者当您有返回静态数据的 DTO 时,例如服务描述、使用条款等。 -
我的意思不是同伴扩展他们所伴随的类/特征,而是关于在扩展任何其他类/特征时可以“访问自身”的对象。我认为它的类型应该是可访问的(这样你就可以写
object X extends Y[X.type]),但它的值不是。
标签: scala constructor companion-object callbyname