2010-07-27 3 views
1

주어진 클래스를 확장 한 메소드로 전달되는 객체를 체크 인하는 가장 좋은 방법은 무엇입니까?Java가 메소드에 전달 된 객체가 특정 클래스를 확장하도록 보장

현재 내가 보낼 수있는 데이터의 ByteBuffer를 소요하는 방법과 내가 쓴 '플레이어'클래스가 있고, 클라이언트로 전송되는 IO 서버의 데이터를 위로 큐 :

public void send(ButeBuffer toSend, Player player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

내가 뭘 할 수있는 선수 클래스를 확장하는 모든 개체가 전달되는 플레이어 개체를 허용하고 싶습니다. 몇 가지 검색을 수행하고 다음과 같은 것을 찾았습니다.

public void send(ByteBuffer toSend, Player<? extends Player> player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

하지만 컴파일 오류가 발생하고 정확히 무슨 일이 일어나는지 이해하지 못합니다. 이것이 올바른 방법일까요? 그렇다면 누구나이 코드가 구체적으로 무엇을하는지, 왜 작동하지 않는지 설명 할 수 있습니다. 또는이를 자세히 설명하는 기사에 링크 할 수 있습니다.

Alternatlly, 나는 내가 이런 식으로 설정할 수 있습니다 가정 :

public void send(ByteBuffer toSend, Object player) 
{ 
    // Check that the player extends Player, using instanceof or something 
    // along those lines 

    // Prep the ByteBuffer, and queue the data to send 
} 

그러나, 그 코드는 위의 코드에 비해 나에게 가지 취성 느낀다.

모든 도움을 환영합니다. 고마워요 :)

+0

'Player 는 플레이어 클래스가 generic 클래스 일 것을 요구합니다 :'public class Player {...'만약 당신이 제네릭 클래스로 만들었더라도, Player >'. 일반 클래스는 콜렉션과 같은 임의의 정보를 포함하기위한 클래스입니다 (예를 들어'java.util.ArrayList'를보십시오). 다른 사람들이 말했듯이 첫 번째 코드 샘플은 사용자 목적에 가장 적합합니다. –

답변

7

내가 틀리지 않았다면 플레이어 구문을 그대로 유지하면 플레이어의 하위 클래스에서 작동합니다. 그것은 다형성입니다.

+0

매일 새로운 것을 배웁니다! 정보 주셔서 감사합니다 :) – vimalloc

3

send의 현재 정의는 Player (또는 나중에 Player 인터페이스를 만들기로 결정한 경우 구현)의 하위 클래스를 이미 허용합니다.

2

현재 메서드는 플레이어의 모든 하위 클래스를 허용합니다 (첫 번째 메서드를 사용하는 경우). 당신이 (특정 방법을 실시하고 당신이 그들을 호출 할 수 있습니다 보장하기 위해) 인터페이스를 사용하여이 작업을 수행하기를 원한다면, 당신은 클래스를 genericizing 시도하고 같은 것을 수행 할 수 있습니다

public class MyClass<T extends PlayerInterface> { 
    public void send(ByteBuffer toSend, T player) {  
     // prep the byte buffer for sending, and queue it on the IO server 
    } 
} 

을하지만 잔인한 수 있습니다 . 이 경우 인터페이스를 매개 변수로 사용하는 것이 더 나을 수 있습니다.

public void send(ByteBuffer toSend, PlayerInterface player) {  
    // prep the byte buffer for sending, and queue it on the IO server 
} 
2

첫 번째 방법은 괜찮습니다.

public void send(ButeBuffer toSend, Player player) 
{ 
    // prep the byte buffer for sending, and queue it on the IO server 
} 

그것은 .. 유일한 유형 플레이어의 객체 (또는 플레이어를 확장하는 객체) 유효한 매개 변수입니다 것을 보장

내가 매개 변수로 허용되지 않는 것을 허용되는 것을 정의하는 인터페이스를 사용하는 것이 좋습니다 것입니다.

관련 문제