从伴随对象中的特征访问字段

oct*_*ian 4 scala

我有类似以下代码(我简化了它):

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)))
}
Run Code Online (Sandbox Code Playgroud)

CONST_VALUE基本上,我在 Trait 中声明了一个常量A。我试图在伴生对象中使用它B来实例化该类B。但是,我无法A.CONST_VALUE从伴随对象访问B。(我收到编译错误)。

那么我该怎么做呢?

Jör*_*tag 5

你不能这样做。

首先,object B是 的伴生对象class B,而不是trait A。同伴需要具有相同的名称并在同一编译单元中定义。

其次,CONST_VALUE是 的实例字段trait A它是实例的成员A,而不是 的成员A

第三,当你说你基本上是在A.CONST_VALUE调用. 但您只能调用对象/值的方法。不是一个对象,它是一个类型,类型和值存在于不同的世界,你不能混合两者。CONST_VALUEAA

第四, your 的CONSTANT_VALUE命名具有误导性:只有final vals 是常量值定义,因此 yourCONSTANT_VALUE实际上并不是常量值。

第五,您的apply方法调用自身(B()是 的语法糖B.apply()),因此需要返回类型注释。

第六,您的apply方法使用两个参数调用自身,但它仅使用一个参数定义。

第七,您创建了一个Array[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)))
}
Run Code Online (Sandbox Code Playgroud)