2015-12-25 26 views
7

Ich versuche den Nutzen einer Programmiersprache zu verstehen, die statisch getippt wird, und damit frage ich mich, warum wir eine Deklaration eintippen müssen? Dient es irgendeinem Zweck, anstatt den Typ explizit zu machen? Wenn dies der Fall ist, sehe ich den Punkt nicht. Ich verstehe, dass die statische Typisierung eine Typüberprüfung zur Kompilierungszeit ermöglicht, aber wenn wir die explizite Typdeklaration weglassen, kann Java während der Kompilierungszeit noch keinen Typ ableiten?Warum ist die Typdeklaration in einer statisch typisierten Sprache wichtig?

Zum Beispiel, sagen wir, wir haben in Java:

myClass test = new myClass(); 

Ist nicht die Typdeklaration hier überflüssig? Wenn ich mich nicht irre, ist dies eine statische Bindung, und Java sollte wissen, test ist vom Typ myClass ohne explizite Deklaration des Typs, selbst zur Kompilierzeit.

Antwort auf mögliche Duplikate: Dies ist keine Frage in Bezug auf statische vs. dynamische Typ, sondern eher auf Typ Rückschluss in statisch typisierten Sprachen, wie in der angenommenen Antwort erklärt.

+3

Was ist, wenn Sie 'Klasse B erweitert A' und' Aa = neu B() 'haben? Wie soll der Compiler auf die Art von "a" schließen? – gefei

+0

@femtoRgon Bei dieser Frage geht es um Typinferenz in statisch typisierten Sprachen, um dynamisch typisierte Sprachen. – yshavit

+0

Sorry, * nicht über dynamisch typisierte Sprachen. :) – yshavit

Antwort

11

Dort sind statisch typisierte Sprachen, die es Ihnen ermöglichen, die Typdeklaration wegzulassen. Dies wird type inference genannt. Die Nachteile sind, dass es schwieriger zu gestalten ist (für die Sprachdesigner), schwerer zu implementieren (für die Compiler-Autoren) und schwieriger zu verstehen ist, wenn etwas schief geht (für Programmierer). Das Problem mit dem Letzten ist, dass, wenn viele (oder alle) Ihrer Typen abgeleitet werden, der Compiler Ihnen nicht viel mehr sagen kann als "die Typen sind nicht alle konsistent" - oft über eine kryptische Nachricht.

In einem trivialen Fall wie dem, den Sie anführen, ja, es ist einfach. Je weiter Sie sich von dem trivialen Fall entfernen, desto komplexer wird das System.

Java macht tatsächlich ein bisschen Typ-Inferenz, in sehr begrenzten Formen. Zum Beispiel in diesem Snippet:

List<String> emptyStrings = Collections.emptyList(); 

... hat der Compiler gefolgert, dass der Aufruf der Methode emptyList eine List<String> zurückgibt, und nicht nur ein List<T> wo der Typ T ist nicht spezifiziert. Die nicht abgeleitete Version dieser Zeile (die auch Java ist) lautet:

List<String> emptyStrings = Collections.<String> emptyList(); 
+1

Genau das habe ich mich gefragt, danke !! Jetzt habe ich noch eine ähnliche Frage: Ordnet der deklarierte Typ eine andere Speichermenge in einer Sprache wie Java zu? Wie 'A a;' 'vs B b;', wenn 'A' hat 100 Instanzvariablen und B 0, sagen wir mal, würde es keinen Unterschied bei der Deklaration machen, oder hat diese kommen nur bei der Instanziierung? Wie wäre es mit Primitiven? – rb612

+2

@ rb612 Es macht überhaupt keinen Unterschied; die Erinnerung ist rein durch das Objekt bestimmt, nicht durch den Bezug darauf. Die Referenz ist nur eine feste Größe, also nehmen die drei Referenzen 'String a',' List b' und 'ArrayList > c 'alle genau den gleichen Platz ein (und tatsächlich hat die JVM gewonnen) Ich weiß nicht einmal, dass sie etwas anderes sind als "eine Referenz auf ein Objekt". Primitives haben keinen Polymorphismus überhaupt, aber sie haben unterschiedliche Größen haben (ein Byte ist nur ein Byte, eine kurze zwei Bytes, usw.). – yshavit

+0

das ist toll, danke! so im Wesentlichen vor, erklärt die explizite Typen in einer statisch typisierten Sprache wie Java dient nur Typinferenz zu vermeiden und hat nichts mit Speicherzuweisung zu tun? – rb612

1

Es ist notwendig. Sie können Vererbung haben, wo Typen notwendig sind.

Zum Beispiel:

Building build1 = new House(); 
Building build2 = new SkyScraper(); 

Es ist das gleiche in Polymorphismus.

Sie können dann alle Building s zum Array zum Beispiel sammeln. Wenn es eine House und eine SkyScraper geben wird, können Sie dies nicht tun.

+0

Richtig, das kann ich sehen. Aber wenn du build1 einfach ein Haus sein willst, wie 'House build1 = new House();', solltest du nicht in der Lage sein, das erste Haus fallen zu lassen und einfach 'build1 = new House();' zu schreiben? – rb612

+0

beantworten bearbeitet @ rb612 – maskacovnik

+0

Danke.Ich denke, meine Frage war nicht richtig formuliert und hatte mehr mit Typinferenz zu tun, was in der Antwort von @yshavit erklärt wird. – rb612