Vous ne pouvez pas faire cela.
Tout d'abord, object B
est l'objet qui accompagne class B
et non à trait A
. Les compagnons doivent porter le même nom et être définis dans la même unité de compilation.
Deuxièmement, CONST_VALUE
est un champ d'instance de trait A
. Il est membre d'un instance de A
qui n'est pas membre de A
.
Troisièmement, lorsque vous dites A.CONST_VALUE
vous appelez en fait la méthode CONST_VALUE
sur A
. Mais vous ne pouvez appeler des méthodes que sur des objets/valeurs. A
n'est pas un objet, c'est un type Les types et les valeurs vivent dans des mondes différents, on ne peut pas mélanger les deux.
Et quatrièmement, votre CONSTANT_VALUE
porte un nom trompeur : seul le final val
sont des définitions de valeurs constantes, de sorte que votre CONSTANT_VALUE
n'est pas une valeur constante.
Cinquièmement, votre apply
s'appelle elle-même ( B()
est un sucre syntaxique pour B.apply()
), et a donc besoin d'une annotation de type de retour.
Sixièmement, votre apply
s'appelle elle-même avec deux mais il est défini avec seulement un paramètre.
Septièmement, vous créez un Array[Array[Byte]]
mais je ne vois pas très bien pourquoi vous voulez faire cela et à quoi cela vous sert.
C'est tout un Chargement de camions Il y a beaucoup de problèmes (surtout si l'on considère qu'il n'y a qu'une poignée de lignes de code au départ), qu'il faut résoudre un par un. En voici un possible partiel solution, mais je ne vois pas très bien de quoi il s'agit exactement que vous essayez d'atteindre.
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)))
}