2013-12-10 2 views
1

의 :나는이 이상한 예외에 일어 났는데 오늘 아침에 밖 어디 ClassCastException이 안드로이드

java.lang.ClassCastException가 : org.apache.harmony.luni.lang.reflect.ImplForVariable는 캐스트 할 수없는 ~ java.lang.Class

형식 인수 클래스를 얻으려고 할 때 발생합니다.

예 :

public static Class getTypeParameterClass(Object o, int index) { 
    return (Class) 
      ((ParameterizedType)o.getClass() 
        .getGenericSuperclass()) 
        .getActualTypeArguments()[index]; 
} 

당신이 볼 수 있듯이,이 메소드는 지정된 객체의 클래스의 형식 매개 변수 중 하나를 가져옵니다.

지금은 몇 달 동안 작동했지만 오늘은 중단되었습니다.

사용 예 :

Collection<Object> foo = new ArrayList<Object>(); 

Class<?> fooClass = Utils.getTypeParameterClass(foo, 0); 

그리고이 충돌합니다.

Java를 너무 많이 비난 한 저주가 있습니까?)?

감사합니다.

+0

내 IDE/sdk/ndk/jdk를 다시 설치 한 후에도 여전히이 버그가 있으며 구성 오류가 의심됩니다. 다른 컴퓨터에서 시도해야합니다. – vitaminwater

답변

0

우선, 나는 그의 인내심을 위해 Grey에게 거대한 "고맙다"라고 말하게한다.

내가 마침내 잘못 생각했다.

나는 잘못된 필드에 집중하고있었습니다.

회색은 유형 지우기 때문에 컴파일 타임에 명시 적으로 제공되지 않는 유형 매개 변수를 가져올 수 없음을 지적합니다.

나는 다른 필드를 완전히 잊어 버린 콜렉션 필드에 오류가 있다는 것을 확신했다.

내 데이터가 webservices에서 왔고 JSON 매퍼가 루트로 직접 목록을 가져올 수 없기 때문에 객체 컬렉션, 날짜 (캐싱) 및 기타 몇 가지 관련 모델을 포함하는 모델을 정의해야했습니다. 페이징하기.

이 모든 유사한 클래스를 작성하는 것은 말도 안되는 이었기 때문에 그래서, 정말 같은 과정을 일반화하려고 :

public abstract class ModelList<T> { 

     [ paging and caching stuffs ] 

     @ForeignCollectionField 
     Collection<T> collection; 

     [ constructor, getters, setters ] 

} 

을하고 만 같이 서브 클래스가 있습니다

@DatabaseTable(tableName = "category_list") 
public class CategoryList extends ModelList<Category> { 

} 

그래서 내가 할 수있는을 좀 덜 자세한 클래스가 있으므로 Robospice의 ObjectPersister를 사용하여 캐싱 프로세스를 일반화 할 수 있습니다.

(지식이 부족하기 때문에) 이해할 수없는 것은 런타임에 매개 변수를 찾을 수 없다는 것입니다.

나를 혼란스럽게 한 것은 내가 버그를 재현하려고 시도한 테스트가 버그를 생성했다는 것입니다! 그러나 그들은 틀 렸습니다.

그래서주의 (내가했던 것처럼 완전한 넌센스에 직면 할 수 등) 자체에 :

  • 이 (가 그것은 버그가 아니에요, 그것은 버그가 아니라, 버그가 아니라 언어에 대한 믿음을 잃지 말고 .. .) 항상 항아리에 소스를 첨부 단지에 ModelList에서 컬렉션을 이동, 중단 점 해결책은 아주 간단했다 끝에

을 설정

  • ) (너무 많이하지 언어를 비난하지 않는다
  • 서브 프라임 ModelList에서 getters 및 setter를 추상 메서드로 유지합니다 (일반 ObjectPersisters의 경우).

    누군가가이 케이스를 위해 ormlite/jackson/robospice를 사용하여 더 좋은 해결책을 알고 있다면 나는 그것을 듣기 때문에 기뻐할 것입니다.

  • 1

    이 메소드는 주어진 객체의 클래스에 대한 유형 매개 변수 중 하나를 가져옵니다.

    따라서 제네릭 형식 삭제로 인해 특별히 허용되지 않는 작업이 있습니다. ArrayList의 제네릭 매개 변수를 조사하려고하지만 코드가 실행 중일 때 특정 제네릭 형식이 더 이상 표시되지 않습니다.

    수퍼 클래스를 다루는 경우 수퍼 클래스 해킹 (해킹)이 효과적입니다. 사용자가 정의한 경우 일하는 것이 당신의 ArrayList처럼이 경우 foo에서

    Collection<Object> foo = new ArrayList<Object>() { 
        private static final long serialVersionUID = -594043150300376049L; 
    }; 
    

    ArraryList를 확장하는 클래스입니다. 어떤 이유로 슈퍼 클래스에서 제네릭 형식 매개 변수를 사용할 수 있습니다.

    +0

    안녕 회색, 당신이 ormlite-android github에 게시 한 질문에 답하고있는 것 같습니다. 실제로 문제가 ormlite와 관련이 없다는 것을 알았지 만, 내 앱의 Android 런타임을 망쳤습니다. 따라서 반사도 역시 f * cked입니다. 나는 별도의 건물 환경에서 시도했지만 어느 쪽도 작동하지 않습니다. 이제 나의 마지막 희망은 intelliJ 프로젝트를 다시 만들고 그 버그를 수정하기를 바랍니다. 어쨌든 나는 아직도 망쳐 버린 것을 이해하고 싶습니다! 어쨌든 고마워. – vitaminwater

    +0

    업데이트, 처음부터 프로젝트를 다시 만들었지 만 충돌은 여전히 ​​있습니다. 이제 완전히 해결할 수 없습니다. – vitaminwater

    +0

    완료, 감사 Grey. – vitaminwater