2009-09-28 2 views

답변

6

는 :

이러한 경고는 Clojure에서이 C의 유형을 알 수있는 방법이 없다는 것을 나타냅니다. 당신은 메타 데이터를 구문 ^Class을 사용하여이 문제를 해결하는 타입 힌트를 제공 할 수

장소 유형 힌트와
(defn describe-class [#^Class c] 
{:name (.getName c) 
:final (java.lang.reflect.Modifier/isFinal (.getModifiers c))}) 

, 반사 경고가 사라집니다. 컴파일 된 Clojure 코드는 컴파일 된 Java 코드와 정확히 동일합니다. 또한 describe-class를 클래스가 아닌 다른 것으로 호출하려는 시도는 ClassCastException과 함께 실패합니다.

요약하면 반사 캐스팅은 캐시되지 않고 제거됩니다.

+0

유형 힌트 작동 ​​방식에 대한 잘못된 이해를 고치러와 주셔서 감사합니다. 캐시 반영에 대한 더 큰 의문점은 아직 답을 얻지 못했지만, 가능한 한 간단하지 않다는 의미가 있음을 인정할 것입니다. –

3

리치 가르치 려 친절하게도했다 : ". JDK의 적절한에 대한 진짜 대답은 JSR 292, memoizaton보다 훨씬 더 나은 성능을 호출 사이트 캐시의 적절한 구성을 허용 invokedynamic 명령이다"