Dies scheint wie ein Fehler für mich. Bearbeiten: gefunden, das ist SI-5712.
Abschnitt § 5.3 des 2.9 SLS sagt:
(ps1). . . (psn) sind formale Wertparameterklauseln für den primären Konstruktor der Klasse. Der Umfang eines Formalwertparameters umfasst alle nachfolgenden Parameterabschnitte und das Template t.
Es gibt eine Ausnahme:
jedoch ein formeller Wertparameter kann nicht Teil der Arten von einem der übergeordneten Klassen oder Mitglieder der Klassenvorlage t bilden.
Aber es sagt, es ist nicht Teil der Arten von jeder der übergeordneten Klassen oder Mitglieder sein, nicht jeder der folgenden Parameter Abschnitte, so dass es nicht scheint nicht wegabhängig Typen zwischen verbieten Argumentgruppen.
Sie können mit einem sekundären Konstruktor, um dieses gehen:
class Foo[S <: Sys] private[this]() {
def this(system: S)(global: system.Global) = this
}
bearbeiten: Diese sekundären Konstruktor Abhilfe ist nicht sehr gut: Aussetzens system
oder global
sehr schwierig geworden, weil nur der primäre Konstruktor val
s erklären kann .
Ein Beispiel mit einer Besetzung:
class Foo[S <: Sys] private[this]() {
private[this] var _system: S = _
private[this] var _global: system.Global = _
def this(system0: S)(global0: system0.Global) = {
this
_system = system0
_global = global0.asInstanceOf[system.Global]
}
lazy val global: system.Global = _global
lazy val system: S = _system
}
Aber das ist schrecklich zu bekommen. @ Senias Vorschlag ist viel besser.
Ich habe diesen Satz in der SLS gefunden: * Ein formaler Wertparameter darf jedoch nicht Teil der Typen der übergeordneten Klassen oder Mitglieder der Klassenvorlage t. * (5.3, p56) bezüglich * formal sein Wertparameterklauseln für den primären Konstruktor *. – Beryllium
Workaround: 'Merkmal Foo [S:
senia
@senia Ja, ich verwende jetzt eine Eigenschaft, die Konstruktormethode ist zwar ziemlich hässlich, aber es funktioniert. –