Scala 从同伴对象中的trait访问字段
我有如下代码(我简化了它): 基本上,我在traitScala 从同伴对象中的trait访问字段,scala,Scala,我有如下代码(我简化了它): 基本上,我在traita中声明了一个常量CONST\u值。我试图在伴生对象B中使用它来实例化类B。但是,我无法从伴生对象B访问A.CONST\u值(我得到一个编译错误) 那么我该怎么做呢?在同伴对象A中声明val CONST\u VALUE=10,而不是traitA。还更正了对象BB中的apply方法定义 trait A { } object A { final val CONST_VALUE = 10 } class B(someValue: Int,
a
中声明了一个常量CONST\u值。我试图在伴生对象B
中使用它来实例化类B
。但是,我无法从伴生对象B
访问A.CONST\u值(我得到一个编译错误)
那么我该怎么做呢?在同伴对象A
中声明val CONST\u VALUE=10
,而不是traitA
。还更正了对象B
B中的apply
方法定义
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)))
}
你不能这样做
首先,对象B
是类B
的伴生对象,而不是特征A
。同伴需要具有相同的名称,并在相同的编译单元中定义
其次,CONST\u VALUE
是trait A
的一个实例字段。它是a
实例的成员,而不是a
的成员
第三,当你说A.CONST\u VALUE
时,你基本上是在A
上调用方法CONST\u VALUE
。但只能对对象/值调用方法A
不是一个对象,它是一种类型,类型和值生活在不同的世界中,不能将两者混用
第四,您的常量值
被错误地命名:只有最终值
s是常量值定义,因此您的常量值
实际上不是常量值
第五,您的apply
方法调用自身(B()
是B.apply()
的语法糖),因此需要返回类型注释
第六,您的apply
方法使用两个参数调用自身,但它只使用一个参数定义
第七,创建一个数组[Array[Byte]]
,但我不清楚为什么要这样做以及需要它做什么
这是一大堆问题(特别是考虑到只有很少几行代码可以开始),需要逐一解决。这里有一个可能的局部解决方案,但我不清楚您到底想要实现什么
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)))
}
旁注-为了使变量保持常量,需要添加final
关键字:final val CONST_VALUE=10
。
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)))
}