2013-03-05 5 views
6

Könnte mir jemand diesen Fehler erklären:Kann kein lokal mit einem primitiven initializer Hinweis geben

user> (let [^int i 3] i) 
CompilerException java.lang.UnsupportedOperationException: Can't type hint a local with a primitive initializer, compiling:(NO_SOURCE_PATH:1) 

Ich verstehe nicht,

  • was genau kann ich nicht typen Hinweis und warum ?

  • Warum kann ich einen Array-Typ Hinweis in der gleichen Situation verwenden?

    user> (let [^ints ii (int-array 1)] ii) 
    #<int[] [[email protected]> 
    
  • Wie tippen Sie lokale Integer-Variablen?

+0

Siehe http://clojure.org/java_interop#Java%20Interop-Some%20optimization%20tips: "([foo (int bar)] ...) ist der richtige Weg, um ein primitives Local zu erhalten. Nicht verwende^Integer usw. " –

+0

Wahrscheinlich, weil der Compiler bereits genug weiß, um den Typ von 'i' hier zu bestimmen. – Alex

+0

@ A.Webb Danke. Es löst wahrscheinlich mein praktisches Problem. Ich werde die Frage für eine Weile offen halten. Hoffentlich kann jemand den Grund für diese Einschränkung erklären. – sastanin

Antwort

4

Diese Ausnahme wird vom Compiler aus this Linie geworfen. Wenn Sie einen Ausdruck verwenden, der eine primitive Konstante oder etwas ist, das zur Kompilierungszeit als primitive Konstante ausgewertet werden kann, wie z. B .: (+ 1 10), kann der Compiler den Typ des Objekts selbst erkennen und benötigt keine Typhinweisdaten. Überprüfen Sie die Methoden getJavaClass und hasJavaClass in derselben Klasse, auf die der frühere Link verweist. Diese Methoden prüfen, ob der Ausdruck primitiv ist, und holen dann die Klasse aus dem Ausdruck selbst, andernfalls verwenden Sie type hinting, falls angegeben.

+0

Das ist wirklich interessant zu hören, aber die ganzen Abschnitte von CH 15.1-3 in der Joy of Clojure (zweite Ausgabe, die erst vor ein paar Wochen herauskam) sind voll von Beispielen, die das Gegenteil beweisen. Natürlich sind auch ihre Beispiele in meiner Arbeit versaut, aber ich bin neugierig, warum sie das zur Optimierung empfehlen. Gibt es eine Möglichkeit zu optimieren, indem Sie den Type Checker ausschalten oder ist das ein unordentlicher Bearbeitungsjob und sie verwenden tatsächlich eine ältere Version von Clojure, in der solche Typhinweisen erlaubt waren? – kurofune

Verwandte Themen