2013-05-16 6 views
0

이 질문의 배경은 이전 질문에서 찾을 수 있습니다.클래스 유형을 참조 클래스로 변환

이전 질문 : http://tinyurl.com/chq4w7t

내가 송신 기능이있는 인터페이스 Comm 있습니다

public interface Comm 
{ 
    public int send(Socket socket, byte[] bytes); 
} 

을 나는 다양한 수업을 (Server, Client, Serial 등) 인터페이스 Comm를 구현합니다. 이러한 클래스 객체를 Comm 객체와이 Comm 클래스 중 하나를 통신 매체로 사용하도록 구성 할 수있는 다양한 플러그인 사이의 관리자 역할을하는 다른 클래스의 다른 보내기 함수에 매개 변수로 전달할 수 있습니다.

(Server, Client, Serial 등) 나는 Class[]를 반환하고 매개 변수로 문자열을 취하는 getClasses 기능이 내 앞의 질문에서

public void Send(Comm com, Socket socket, byte[] message) 
{ 
    com.send(null, message); 
} 

이하 송신 기능에 매개 변수로 전달 될 수 있습니다 . 이것은 다른 구성 옵션을 제공하는 데 사용됩니다.

예를 들어 Class.forName("Client");을 사용하여 클라이언트에 Class 개체를 반환합니다.

이제

결국 내 질문은 다음과 같다 :

은 어떻게 Comm 유형 Class에서 변환합니까? 나는 아이디어 얻기 위해 당신을위한 다음 시도했다 : (. cboxComm 내 코드를 테스트하기위한 테스트 콤보입니다 그것은 Comm 객체의 클래스 이름을 포함)

// Some code I have no idea how it works, an explanation would be awesome 
// regarding the diamond syntax 
Class<? extends Comm> classComm = Class.forName(cboxComm.getSelectedItem().toString()); 

// Error here, I don't know how to convert or cast it   
Comm com = classComm; 

// Sending function as described above 
send(com, null, null); 
+0

'Comm com = (Comm) classComm; '이 (가) 작동하지 않습니까? 그래도 instanceof 확인해야합니다. – Ankit

+0

@Ankit : 나는 그것을 기대하지 않을 것입니다! –

+0

"다이아몬드 구문"에 대한 귀하의 의견은별로 의미가 없습니다 - 당신은 * 다이아몬드 구문을 사용하지 않습니다. –

답변

5

당신은에 Class 개체에서 변환 할 수 없습니다 클래스의 인스턴스 예를 들어 인스턴스를 만들어야합니다. 이 클래스의 공용 매개 변수가없는 생성자를 필요로

Comm com = classComm.newInstance(); 

참고 : Class.newInstance() 방법. 항상 코드에서 그렇습니까? 그렇지 않다면 적절한 생성자를 가져 와서 리플렉션을 사용하여 호출해야합니다. 그러면 좀 더 복잡해집니다. AS를

옆으로,이 당신을 위해 모든 작동 놀랐어요 :

정말 forName에 의해 반환 된 클래스가 Comm를 구현하는 것을 확인 어디에도 없습니다
Class<? extends Comm> classComm = Class.forName(...); 

. 나는이이 요구 될 것으로 예상했을 것이다 : 그 시점에서

Class<?> classComm = Class.forName(); 
Comm comm = (Comm) classComm.newInstance(); 

, 캐스트 적절한 검사를 수행합니다.

+0

아 감사합니다! 너는 최고야! – Armandt

+0

네, 맞습니다. 방금 테스트 했어. 그 시점에서 InstantiationException이 발생합니다. 내 클래스 생성자가 매개 변수를 사용하기 때문에 이것이 신뢰할 수 있습니까? 하하 http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html – Armandt

+0

테스트를 수행했습니다. 매개 변수가없는 각'Comm' 객체에 대한 생성자를 만들었습니다. 귀하의 코드는 다음 작품 :). 리플렉션이 어떻게 작동하는지 알아 내야 만합니다. – Armandt

관련 문제