2013-10-25 3 views
3

괜찮습니다. 내 자바 프로그램에 대한 반사 작업 중이지만 단순한 것처럼 보이는 부분에 붙어 있지만 작동하지 않습니다. 여기 클래스 캐스팅이 잘못 되었습니까?

내가 할 시도하고 무엇 :

Thread t = new Thread(); 
System.out.println("Casting "+Thread.class.getName()+" to "+Runnable.class.getName()); 
Object newThread = Runnable.class.cast(t); 
System.out.println("New class: "+newThread.getClass().getName()); 

예상 출력 New class: java.lang.Runnable 될 것이다, 그러나, 그것은 New class: java.lang.Thread가 반환합니다.

내가 뭘 잘못하고 있니?

답변

4

개체 참조 형식과 관련된 어떤 형식인지 이해해야합니다. 일반 주조와 마찬가지로 Class's cast method은 개체의 실제 유형을 변경하지 않습니다. 변경되지 않은 객체를 참조하는 적절한 유형의 참조 변수를 생성합니다.

Threadt은 여전히 ​​Thread입니다. Thread implements Runnable이기 때문에 캐스트가 실제로 작동합니다. 그렇지 않으면 ClassCastException이 던졌습니다. 하지만 여전히 Thread입니다.

+0

감사합니다. 내 문제를 해결했지만 실제 문제는 다른 곳에서 거짓말을했다. –

1

여기 Thread 클래스가 정의하는 방법은 (그리고이 경우에 브라켓을 통해 정상 캐스팅을 사용할 수 있습니다) :

public class Thread 
extends Object 
implements Runnable 

그래서 여전히 클래스를 반환 Thread 클래스의 인스턴스 인 객체 runnable로 캐스팅하더라도 Thread로 이름을 지정하십시오.

관련 문제