Nicht statische Typisierung bedeutet, dass Sie haben zu werfen eine variable, wenn Sie möchten, ändern Sie Ihren Typ?

StackOverflow https://stackoverflow.com/questions/600126

Frage

Gibt es andere Möglichkeiten, das ändern einer variable den Typ in einer statisch typisierten Sprache wie Java und C++, außer "casting"?

Ich versuche herauszufinden, was der größte Unterschied in der Praxis zwischen dynamischer und statischer Typisierung und immer wieder sehr akademischen Definitionen.Ich Frage mich, was es bedeutet, in Bezug auf das, was mein code aussieht.

War es hilfreich?

Lösung

Stellen Sie sicher, dass Sie nicht bekommen, statische vs. dynamische Typisierung verwechseln mit stark gegen schwache Typisierung.

  • Statische Typisierung:. Jede Variable, Methodenparameter, Rückgabetyp usw. hat einen Typen zum Zeitpunkt der Kompilierung bekannt ist, entweder erklärt oder gefolgerte
  • Dynamische Typisierung: Typen werden ignoriert / nicht bei der Kompilierung existiert
  • Starke Typisierung. Jedes Objekt zur Laufzeit einen bestimmten Typ hat, und Sie können diese Operationen nur durchführen, die für diese Art definiert werden
  • Schwache Typisierung. Laufzeit-Objekte entweder keinen expliziten Typen hat, oder versucht das System automatisch Typen zu umwandeln, wo immer erforderlich

Diese beiden Gegensätze können frei kombiniert werden:

  • Java ist statisch und stark typisierte
  • C ist statisch und schwach typisierte (Zeiger arithmetics!)
  • Ruby dynamisch und stark typisierte
  • JavaScript ist dynamisch und schwach typisierte

Genrally bedeutet statische Typisierung, dass viele Fehler vom Compiler abgefangen werden, die Laufzeitfehler in einer dynamisch typisierte Sprache sind - aber es bedeutet auch, dass Sie viel Zeit sich Gedanken über Arten, in vielen Fällen unnötig (siehe Schnittstellen ausgeben vs. Ente eingeben).

starke Typisierung bedeutet, dass jede Konvertierung zwischen Typen explizit sein müssen, entweder durch einen Gieß- oder durch die Verwendung von Konvertierungsverfahren (beispielsweise eine Zeichenkette in eine ganze Zahl Parsing). Das bedeutet mehr Schreibarbeiten, hat aber den Vorteil, dass Sie die Kontrolle über die Dinge zu halten, während schwache Typisierung in Verwirrung führt oft, wenn das System hat einige obskure implizite Konvertierung, die Sie mit einem völlig falschen Variablenwert läßt die Verwüstung zehn Methode verursacht ruft nach unten dem Linie.

Andere Tipps

In C ++ / Java Sie können den Typ einer Variablen ändern.

Statische Typisierung : Eine Variable hat einen Typ bei der Kompilierung Typ zugeordnet und nicht ändert

.

Dynamische Typisierung : Der Typ einer Variablen kann während der Laufzeit ändern, z.B. in JavaScript:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

Der wesentliche Unterschied besteht darin, dass Sie nicht wissen, in Sprachen dynamisch typisiert, bis Sie eine Methode zur Laufzeit verwenden gehen, ob diese Methode existiert. In statisch typisierten Sprachen wird die Prüfung bei der Kompilierung und die Kompilierung schlägt fehl, wenn die Methode nicht existiert hat.

Ich Frage mich, was es bedeutet, in Bezug auf das, was mein code aussieht.

Das Typ-system nicht unbedingt Einfluss darauf haben, wie code aussieht, z.B.Sprachen mit statischer Typisierung, Typ-Inferenz und die implizite Konvertierung (wie Scala zum Beispiel) sehen deutlich, wie dynamisch typisierte Sprachen.Siehe auch: Was Zu Wissen, Bevor Debating-Typ-Systeme.

Sie müssen nicht Notwendigkeit explizites Casting. In vielen Fällen implizites Casting funktioniert.

Zum Beispiel:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

Sie können jedoch nicht ändern Sie den Typ einer Variablen. Sie können Gewerkschaften in C ++ verwenden, obwohl, eine Art dynamischer Typisierung zu erreichen.

Lässt denn er staitically typisierte Sprache und JavaScript für die Dynamc in Java suchen. In Java, für Objekte ist die Variable eine Referenz auf ein Objekt. Das Objekt hat eine Laufzeittyp und die Referenz hat einen Typen. Die Art der Referenz muss die Art des Laufzeitobjekts oder einer ihrer Vorfahren sein. Dies ist, wie Polymorphismus funktioniert. Sie haben zu werfen die Hierarchie des Referenztyps zu gehen, aber nicht nach unten. Der Compiler stellt sicher, dass diese Bedingungen erfüllt sind. In einer Sprache wie JavaScript ist Ihre Variable nur, dass eine Variable. Sie können es haben, was auch immer zeigen Objekt, das Sie wollen, und Sie wissen nicht, welche Art von ihm, bis Sie überprüfen.

Für die Umwandlungen aber es gibt viele Methoden, wie toInteger und toFloat in Java eine Konvertierung zu tun und ein Objekt einen neuen Typs mit dem gleichen relativen Wert zu generieren. In JavaScript gibt es auch Konvertierungsmethoden, aber sie erzeugen auch neue Objekte.

Der Code sollte aussehen actally nicht sehr viel anders, unabhängig davon, ob Sie eine staticly typisierte Sprache verwenden oder nicht. Nur weil Sie den Datentyp einer Variablen in einer dynamisch typisierte Sprache ändern können, bedeutet nicht, dass es eine gute Idee ist, dies zu tun.

In VBScript wird beispielsweise ungarische Schreibweise oft verwendet, um den bevorzugten Datentyp einer Variablen angeben. So kann man leicht erkennen kann, wenn die Code-Typen zu mischen. (Dies war nicht die ursprüngliche Nutzung der ungarischen Notation, aber es ist ziemlich nützlich.)

Mit dem auf den gleichen Datentyp zu halten, vermeiden Sie Situationen, in denen es schwer ist, zu sagen, was der Code tatsächlich tut, und Situationen, in denen der Code einfach nicht richtig funktioniert. Zum Beispiel:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

ungarische Notation können Sie in Code erkennen, dass Typen mischen, wie:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top