Wie kann ich den Konstruktor eines abstrakten Scala-Typs aufrufen?

8

Ich versuche herauszufinden, wie man einen Konstruktor für einen abstrakten Scala-Typ aufruft:

%Vor%

Ist das überhaupt möglich? Ich bin vertraut mit Scala manifests < Ich weiß aber nicht, wie sie hier helfen könnten. Ebenso kann ich nicht herausfinden, wie man das gleiche mit dem apply () - Konstruktor eines Begleitobjekts macht:

%Vor%

Irgendwelche Gedanken dankbar angenommen!

    
Alex Dean 30.09.2011, 22:27
quelle

3 Antworten

7

Es gibt keine direkte Möglichkeit, den Konstruktor aufzurufen oder nur bei einem Typ auf das Begleitobjekt zuzugreifen. Eine Lösung wäre, eine Typklasse zu verwenden, die eine Standardinstanz des angegebenen Typs erstellt.

%Vor%

Sie müssen allen Begleitobjekten von Klassen, die die Erstellung einer Standardinstanz unterstützen, eine implizite Default -Definition hinzufügen.

    
Moritz 30.09.2011, 22:47
quelle
7

Ihre Klasse benötigt einen impliziten Konstruktorparameter, um die Manifest zu erhalten. Dann können Sie Löschen aufrufen, um Class zu erhalten und newInstance aufzurufen, was reflectively den Nullary-Konstruktor aufruft, falls es einen gibt.

%Vor%

Ab Scala 2.10 ist die Eigenschaft erasure im Manifest veraltet. def n = m.runtimeClass.newInstance() macht dasselbe, aber ohne Warnungen.

    
Kim Stebel 30.09.2011 22:47
quelle
0

Ich bin der Meinung, dass dies nicht möglich ist. Ich bin weit entfernt von einem Scala Guru, aber meine Argumentation ist dies:

  1. Sie haben eine Klasse Port mit einem Typargument T, wobei T von Journey erben muss (aber T muss nicht genau Reise sein, das ist wichtig).
  2. Innerhalb von Port definieren Sie eine Methode, die ein neues T erstellt. Diese Klasse hat keine Ahnung, was T ist, und daher sieht der Konstruktor von T aus.
  3. Da Sie nicht wissen, welche Argumente der Konstruktor von T verwendet, wissen Sie nicht, welche Argumente übergeben werden sollen.

Die Lösungen für dieses Problem werden in einer anderen Frage sehr gut behandelt, deshalb werde ich Sie dort für sie zeigen, anstatt hier zu wiederholen: Abstrakte Typen / Typ Parameter in Scala

    
Chris Shain 30.09.2011 22:46
quelle

Tags und Links