Wenn ich eine Klasse zu schreiben versucht, die jede Class[_]
als Parameter akzeptiert:Wo ist das Scaladoc für scala.language.existentials?
case class A(klass: Class[_])
ich diesen Fehler habe:
test.scala:1: warning: inferred existential type Option[Class[_$1]] forSome { type $1 }, which cannot be expressed by wildcards, should be enabled by making the implicit value scala.language.existentials visible. This can be achieved by adding the import clause 'import scala.language.existentials' or by setting the compiler option -language:existentials. See the Scala docs for value scala.language.existentials for a discussion why the feature should be explicitly enabled. case class A(klass: Class[]) ^one warning found
Ich bin bereit, zu wissen, warum es nicht funktioniert. Aber wo ist "Scala docs for value scala.language.existentials"? Ich habe "scaladoc scala.language.existentials" gegoogelt, aber einige Threads bekommen, die ich nicht verstehen kann.
Klarstellung: Ich weiß, dass die ‚richtige‘ Art und Weise, eine solche Klasse zu implementieren ist:
case class A[T](klass: Class[T])
Aber ich möchte wissen, was bedeutet, dass die Warnmeldung.
Ich verstehe es nicht. Meine 'Fallklasse A [T] (klass: Class [T])' funktioniert gut. Was ist der Vorteil von 'ClassTag'? –
@ LaiYu-Hsuan, wenn Sie 'Klasse A [T: ClassTag]' schreiben (es ist dasselbe wie in der Antwort), können Sie diese Klasse wie folgt erstellen: 'new A [String]', nicht so: 'new A (classOf [String])', weil der Compiler automatisch den Wert 'ClassTag' liefert. Es ist der idiomatische Ansatz, eine Laufzeitklasse für eine Typvariable zu erhalten. Und Sie können 'Class [_]' immer aus 'ClassTag [T]' abrufen. –
Es macht Sinn. Danke für die Antwort. –