Klasse Typ erforderlich, aber T gefunden
Kann ich nicht erstellen, ein Schauspieler aus irgendeinem Grund (hier ist eine einfache version von meinem Klassen-Hierarchie):
abstract class Class1[T <: Class2[_]: ClassTag] extends Actor {
//....
val res = List(1, 2, 3) map { x => context actorOf Props(new T(x)) } //error
}
abstract class Class2[U <: Class3 : ClassTag](a: Int) extends Actor { ... }
abstract class Class3(b: Int) extends Actor
Aber es ist ein Fehler zu sagen class type required but T found
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht nennen
new T(x)
mit Typ-parameterT
. Es hätte keinen solchen Konstruktor fürT
:Sollten Sie die Methode zum erstellen
T
ausdrücklich:Alternativ:
where T: new()
?C#
es ist ein syntax-Zucker für zusätzlicheFunc
parameter (wie in meinem zweiten code-Beispiel).abstract createT(i: Int): T
?def createT(i: Int): T
in einer Kind-Klasse (mit einer konkreten Klasse statt T), heißt es "Typen Stimmen nicht überein: gefunden : MyConcreteClass, Bedarf Nichts". Haben Sie eine Idee, warum das so ist?T
. Könnten Sie bitte zeigen Sie code-Beispiel (mit pastebin)?Ein Ansatz, den ich verwendet haben, beinhaltet die Schaffung einer 'instantiator' Eigenschaft, die verwendet werden können zum erstellen von Instanzen von Typen, für die eine implizite instantiator vorhanden ist:
Ich denke, das ist, weil der JVM Einschränkung auch bekannt als "type erasure".
http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
siehe auch "kann Nicht Erstellen Sie Instanzen der Typ-Parameter" auf
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html
Übrigens C# können Sie schreiben:
beim definieren einer Einschränkung
aber leider Konstruktor muss parameterlosen
C#
es ist eine compile-Zeit-syntax-Zucker, es hat nichts mit type-erasure.: new()
imscala
undjava
nicht, weil dertype erasure
- es ist eine compile-Zeit-Mechanismus und diescala
Sprache für Entwickler implementieren es aufjvm
. Sie nur don ' T denke, es ist notwendig.