我有类似下面的代码(我简化了它):
trait A {
val CONST_VALUE = 10
}
class B(someValue: Int, values: Array[Int]) extends A {
//some methods
}
object B {
def apply(someValue: Int) = B(someValue, Array.ofDim[Array[Byte]](someValue).map(block => Array.fill[Byte](A.CONST_VALUE)(0)))
}
基本上,我在特征CONST_VALUE
中声明了一个常量A
。我试图在伴侣对象B
中使用它来实例化类B
。但是,我无法从配套对象A.CONST_VALUE
访问B
。(我收到了编译错误)。
那我怎么能这样做?
答案 0 :(得分:4)
你不能这样做。
首先,object B
是class B
的伴随对象,而不是trait A
。伴随需要具有相同的名称,并在同一个编译单元中定义。
其次,CONST_VALUE
是trait A
的实例字段。它是A
的实例的成员,而不是A
的成员。
第三,当你说A.CONST_VALUE
时,你基本上是在CONST_VALUE
上调用方法A
。但是你只能在对象/值上调用方法。 A
不是一个对象,它是一个类型,类型和值存在于不同的世界中,你不能将它们混合在一起。
第四,您的CONSTANT_VALUE
被误导性命名:只有final val
s是常量值定义,因此您的CONSTANT_VALUE
实际上不是常量值。
第五,您的apply
方法调用自身(B()
是B.apply()
的语法糖),因此需要返回类型注释。
第六,您的apply
方法使用两个参数调用自身,但它仅使用一个参数定义。
第七,你创建了一个Array[Array[Byte]]
,但我不清楚你为什么要这样做以及你需要它做什么。
这是一个完整的 truckload 问题(特别是考虑到只有少量代码行开始),您需要逐个修复。这是一个可能的部分解决方案,但我不清楚你想要实现的是什么 。
trait A
object A {
final val CONST_VALUE = 10
}
class B(someValue: Int, values: Array[Int]) extends A {
//some methods
}
object B {
def apply(someValue: Int): B = new B(
someValue,
Array.ofDim[Array[Byte]](someValue).map(block => Array.fill[Byte](A.CONST_VALUE)(0)))
}
答案 1 :(得分:3)
在随播对象val CONST_VALUE = 10
内声明A
而不是特征A
。还更正了对象apply
B
方法定义
trait A {
}
object A {
final val CONST_VALUE = 10
}
class B(someValue: Int, values: Array[Int]) extends A {
//some methods
}
object B {
def apply(someValue: Int) = new B(someValue, Array.ofDim[Int](someValue).flatMap(block => Array.fill[Int](A.CONST_VALUE)(0)))
}