Scala 从同伴对象中的trait访问字段

Scala 从同伴对象中的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,

我有如下代码(我简化了它):

基本上,我在trait
a
中声明了一个常量
CONST\u值。我试图在伴生对象
B
中使用它来实例化类
B
。但是,我无法从伴生对象
B
访问
A.CONST\u值(我得到一个编译错误)


那么我该怎么做呢?

在同伴对象
A
中声明
val CONST\u VALUE=10
,而不是trait
A
。还更正了对象
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)))
}