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

时间:2016-10-29 15:10:34

标签: 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)))
}

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

那我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

你不能这样做。

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

其次,CONST_VALUEtrait 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)))
}