2013-03-05 12 views
6

mógłby ktoś wytłumaczyć mi ten błąd:nie można wpisać podpowiedź lokalna z prymitywnym inicjatora

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) 

ja nie rozumiem

  • co dokładnie nie mogę typu wskazówkę i dlaczego ?

  • dlaczego mogę używać podpowiedzi typu tablicowego w tej samej sytuacji?

    user> (let [^ints ii (int-array 1)] ii) 
    #<int[] [[email protected]> 
    
  • jak pisać-podpowiedzi lokalnych zmiennych całkowitych?

+0

Zobacz http://clojure.org/java_interop#Java%20Interop-Some%20optimization%20tips: "(niech [foo (int bar)]) jest poprawnym sposobem uzyskania prymitywnego lokalnego. użyj^Integer itp. " –

+0

Prawdopodobnie dlatego, że kompilator już wie wystarczająco dużo, aby określić typ "i" tutaj. – Alex

+0

@ A.Webb Dzięki. Prawdopodobnie rozwiązuje mój praktyczny problem. Pozostawię pytanie otwarte przez chwilę. Mamy nadzieję, że ktoś może wyjaśnić przyczynę tego ograniczenia. – sastanin

Odpowiedz

4

ten wyjątek jest przez kompilator this linii. Zasadniczo, jeśli użyjesz wyrażenia, które jest prymitywną stałą lub coś, co można oszacować w czasie kompilacji jako stała pierwotna, na przykład: (+ 1 10), kompilator może wykryć typ samego obiektu i nie potrzebuje podpowiedzi typu. Sprawdź metody getJavaClass i hasJavaClass w tej samej klasie, w której wskazuje na to wcześniejsze łącze. Te metody sprawdzają, czy wyrażenie jest prymitywne, a następnie pobierz klasę od samego wyrażenia, w przeciwnym razie użyj podpowiedzi typu, jeśli jest dostępna.

+0

To jest naprawdę interesujące, ale cała sekcja CH 15.1-3 w Joy of Clojure (druga edycja, która właśnie wyszła kilka tygodni temu) jest pełna przykładów przeciwnych. Oczywiście ich przykłady zepsuły się również w moim repl, ale jestem ciekawy, dlaczego zalecają, aby zrobić to dla optymalizacji. Czy istnieje jakiś sposób na optymalizację przez wyłączenie sprawdzania typu lub czy jest to niechlujne zadanie edycji i faktycznie używają starszej wersji Clojure, w której dozwolone było takie podpowiedzi typu? – kurofune

Powiązane problemy