2013-04-23 6 views
2

다음 코드에서 명령을 C로 명시 적으로 변환해야하는 이유는 무엇입니까? 명령은 Runnable과 Describable을 모두 구현합니다. 내가 생각하고있는두 개의 인터페이스로 제네릭 형식 매개 변수를 선언 할 때 불필요한 캐스트를 피하는 방법

@Test 
public <C extends Runnable & Describable> void testMapOfCommands() throws Exception 
{ 
    Map<String, C> commands = Maps.newHashMap(); 
    for(Commands command : Commands.values()) 
    { 
     commands.put(command.name(), (C) command); 
    } 
    //Use commands here (not relevant to my question): 
    //CommandLineParser.withCommands(commands).parse("commit"); 
} 

private enum Commands implements Runnable, Describable 
{ 
    commit 
    { 
     @Override 
     public void run() 
     { 
      System.out.println("COMMIT"); 
     } 

     @Override 
     public String description() 
     { 
      return "Commits something"; 
     } 
    }; 
} 

한 가지 해결 방법은 Runnable를하고 설명 가능한 모두 확장 ICommand의를 소개하는 것입니다 :

public interface ICommand extends Runnable, Describable{} 

하지만 난 이미 두 가지 유형이있을 때 새로운 유형을 소개하는 것을 피하기 위해 노력하고있어 쉽게 사용할 수 있으며 이미 Command 클래스가 조금 더 복잡합니다. 내가 빨대를 쥐고 ​​있니?

+0

이들은 인터페이스입니다. – jontejj

+0

먼저 전체 수업을 게시하십시오. 둘째, Runnable과 같은 인터페이스에는 확장이 아닌 구현을 사용해야합니다. – Antimony

+0

코드를 약간 업데이트했습니다. 모든 관련 코드가 게시 된 것 같습니다. 어떤 부분이 빠졌습니까? – jontejj

답변

6

Commandscommand 개체가 있습니다. 그러나 일반 형식 선언 <C extends Runnable & Describable> 때문에 Java는 CDescribableRunnable이 될 것으로 예상하지만 C은 필요하지 않습니다. Commands입니다.

이 특정 테스트 방법은 Commands 이외의 값으로 작동하지 않으므로 일반적이어서는 안됩니다. 이것은 작동해야합니다 :

public void testMapOfCommands() throws Exception 
{ 
    Map<String, Commands> commands = new HashMap<String, Commands>(); 
    for(Commands command : Commands.values()) 
    { 
     commands.put(command.name(), command); 
    } 
} 
+0

+1로 캐스팅 할 수 있습니다. 정확히 내 의견 :-) –

+0

이 효과가 있습니다! 감사. 그러나 컴파일러가 Runnable & Describable로 Command를 전송할 수없는 이유를 이해할 수 있으면 감사 하겠습니다. 내 코드도 잘 작동했는데, (C) 명령을 사용하여 조금 이상했다. – jontejj

+0

자바 컴파일러는 C가'Runnable'과'Describable'을 구현하는 _anything_ 일 수 있다고 생각합니다.'Commands2' 일지라도'Describable'과'Runnable' 둘 다 발생합니다. 그래서'Commands' 타입의 매개 변수를 허용하지 않습니다. 왜냐하면'HashMap '일 수있는 뭔가에'Commands'를 넣을 수 없어야하기 때문입니다. – rgettman

관련 문제