Sie können dies nicht tun.
Zunächst ist object B
das Begleitobjekt zu class B
, nicht zu trait A
. Companions müssen denselben Namen haben und in derselben Compilierungseinheit definiert sein.
Zweitens ist ein Instanzfeld von trait A
. Es ist Mitglied einer Instanz von A
, kein Mitglied von A
.
Drittens, wenn Sie A.CONST_VALUE
sagen, rufen Sie im Grunde die Methode auf A
. Sie können Methoden nur für Objekte/Werte aufrufen. A
ist kein Objekt, es ist ein Typ, Typen und Werte leben in verschiedenen Welten, Sie können die beiden nicht mischen.
Und viertens, Ihre CONSTANT_VALUE
ist irreführend benannt: nur final val
s sind konstante Wertdefinitionen, so dass Ihre CONSTANT_VALUE
ist eigentlich kein konstanter Wert.
Fünftens Ihre apply
Methode nennt sich (B()
ist syntaktischer Zucker für B.apply()
) und benötigt somit einen Rückgabetyp Anmerkung.
Sechstens Ihre apply
Methode nennt sich mit zwei Argumente, aber es ist mit nur ein Parameter definiert.
Siebte, erstellen Sie eine Array[Array[Byte]]
, aber es ist mir nicht klar, warum Sie das tun möchten und wofür Sie es brauchen.
Das ist ein ganzer truckload von Problemen (vor allem, da es nur eine Handvoll von Codezeilen zu beginnen), die Sie eins nach dem anderen beheben müssen. Hier ist eine mögliche teilweise Lösung, aber es ist mir nicht klar, was es ist genau, die Sie versuchen zu erreichen.
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)))
}
Nebenbemerkung - Um eine Variable konstant zu machen, müssen Sie das Schlüsselwort 'final' hinzufügen:' final val CONST_VALUE = 10'. –