Scala ist .Typ und Java .Klasse literal
Frage ich mich, aus einer Sprache, die design-Perspektive, warum Scala entfernt hat Java die Klassen-literal (e. g. String.class
) und ersetzt es mit classOf[String]
, hat aber dann Hinzugefügt "literalen" mit seinen Singletons wie Singleton.type
sondern so etwas wie typeOf[Singleton]
?
- Gute Frage. Diese syntax wird auch verhindert, dass uns von class-Literale in
match
es, was bedauerlich ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine Rationalisierung:
classOf[T]
classOf
definiert ist, inPredef
als eine Funktion mit dieser Signatur:Obwohl es implementiert der compiler, verwenden die syntax der Funktion ist möglich , ohne dass Sie eine Sonderbehandlung in Bezug auf syntax. Also das ist ein Grund hier, diese option zu prüfen.
Alternative wie
String.class
würde bedeuten, dass jede Klasse über eine companion-Objekt mit einem Feldclass
. Es gibt also zwei Probleme:class
ist ein Schlüsselwort, so dass die Ursachen eines Problems, in dem die syntax erfordern würde, ist ein besonderer Fall für Sieclass A
ohne eine companion-Objekt, es würde seltsam sein, um in der Lage sein zu findenA.class
, das wäre, wie der Zugriff auf die Klasse Feld auf der Begleit -A
.A. Typ:
Warum
typeOf[A]
kann verwirrend sein. Es sieht aus wie ein Funktionsaufruf, sondern Arten Leben nicht in derselben Welt wie die Funktion Ergebnisse (Funktion Ergebnisse haben die Typen, aber der Typ selbst ist nur sinnvoll, zur compile-Zeit). Ich zuschreiben kann ein Typ einer variable:Kann ich nicht mit einem Typ versehen werden, wie es ist von einer Funktion zurückgegeben wird:
Auf der anderen Seite Typen können Mitglied sein Objekt:
So ist es keine große Sache zu haben
A.type
beziehen sich auf den Typ des ObjektsA
. Beachten Sie, dass.type
nicht verwendet werden, darüber hinaus unter Bezugnahme auf Arten von singleton-Objekten, also es ist nicht wirklich Häufig..type
ist Scalathis.type
besonders nützlich für die chaining-Methode ruft, zum Beispiel.this.type
.Eigentlich ist es ganz konsistent.
Singleton.type
ist eine abhängige Art derSingleton
, währendclassOf[Class]
ist eine Art parameter an eine Methode.Bedenken Sie:
Der Punkt hier ist, dass
.
wird verwendet, um anzuzeigen, dass etwas ist ein Mitglied von einem Wert. Es kann eineval
einevar
einedef
oder eineobject
und es kann auch eintype
eineclass
oder einetrait
.Da ein singleton-Objekt ist ein Wert, dann
Singleton.type
ist vollkommen gültig.Auf der anderen Seite, eine Klasse ist nicht ein Objekt, so
Class.class
macht keinen Sinn.Class
existiert nicht (als Wert), so ist es nicht möglich, ein Mitglied davon zu werden. Auf der anderen Seite, es ' s definition alsdef classOf[T]: Class[T]
ist schlicht Scala-code (auch wenn die tatsächliche Umsetzung ist compiler-magic).