2013-03-05 4 views
1

SubEditor와 Editor의 두 클래스가 있습니다.ClassCastException 업 캐스팅

public class SubEditor extends Editor {

는 전 주필 객체를 생성하고 편집기를 캐스팅하려고하지만 난 ClassCastException이 얻을 것이다 오전 : 어떻게 내가가 "false"를 얻을조차 수

try { 
    (Editor) ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance(); 
} catch (Exception ex) { 
    try { 
     Object object = ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance(); 

     // prints "false": 
     System.out.println(object instanceof Editor); 

     // prints "bla.SubEditor": 
     System.out.println(object.getClass().getCanonicalName()); 

     // prints "Super: bla.Editor": 
     System.out.println("Super: "+object.getClass().getSuperclass().getCanonicalName()); 
    } catch (Exception e) { 
     // do sth 
    } 
} 

입니다 "SubEditor instanceof Editor"?

예외 :

java.lang.ClassCastException: bla.SubEditor cannot be cast to bla.Editor

당신이 도움이 될 수 있습니다 희망!

인사말,

마틴

그것은 수 있습니다
+0

JSonEditor 또는 주필 :

나는이 두 클래스 로더를 비교하여 인 경우에 확인할 수있을 것 같아요? 이것은 혼란 스럽다. –

+0

죄송합니다. SubEditor를 의미합니다. 업데이트 내 설명 –

답변

3

, 두 개의 클래스가 다른 클래스 로더 인스턴스를 사용하여로드되고 있음.

Editor.getClassLoader().equals(ClassLoader.getSystemClassLoader()) 

, 두 개의 서로 다른 Class 객체에서 다른 클래스 로더의 결과를 사용 따라서 ClassCastException

+0

사실, 당신 말이 맞아요. 그러나 어떻게 될 수 있을까요? 두 클래스 모두 Eclipse에서 만든 동일한 실행 파일에 있습니다. Netbeans에서 개발하는 동안 나는 그런 문제를 겪어 보지 못했습니다 ... –

+0

더 자세한 정보를 게시 할 수 있다면 확실하지 않습니다. 문제에 대한 해결책은'(Editor) ClassLoader.getSystemClassLoader(). loadClass ("bla.SubEditor")'대신'Editor.getClassLoader(). loadClass ("bla.SubEditor" –

+0

알았어, 고마워! 이클립스는 클래스 로더'java.net.URLClassLoader'를 사용하는 반면 시스템 ClassLoader는'sun.misc.Launcher.AppClassLoader' 인스턴스입니다. 대단히 감사합니다. 그러나 이것은 다른 클래스 로더가 같은 이름을 가진 2 개의 클래스 (예 : 클래스'bla.SubEditor'의 2 배)를로드 할 수 있다는 것을 의미할까요? –

관련 문제