2011-04-27 6 views
0

Java에서이 패턴이 무엇인지 알지 못하기 때문에 더 좋은 제목을주는 방법을 모르겠습니다.Java의 일반적인 메소드

는 지금은이 서명하는 방법이 있습니다

public Directory getDirectory(Class<? extends Directory> type) { ... } 

을 그리고 당신은 다음과 같이 호출 : 유형에

MyDirectory directory = (MyDirectory)getDirectory(MyDirectory.class); 

제약은 MyDirectoryDirectory에서 파생해야한다는 것을 보장합니다.

정말로하고 싶은 것은 캐스트를 피하고 필요한 코드의 양을 줄이는 것입니다. C#에서는 다음과 같이 말할 수 있습니다.

MyDirectory directory = getDirectory<MyDirectory>(); 

Java에서 이와 비슷한 방법이 있습니까? 나는 버전 1.4부터 자바를 코딩하지 않았다!

답변

11
public <T extends Directory> T getDirectory(Class<T> type) { ... } 

MyDirectory directory = getDirectory(MyDirectory.class); 
+0

지우기 덕분에 최선의 선택입니다 .. – pickypg

+0

고마워요. 반환 유형으로 'T'를 정확히 빼 냈습니다. return type : 실제로는 제약 조건 일까? –

+1

@Drew :''T extends Directory ''는 타입 메쏘드'T'를 generic 메쏘 od ... 특정 경계 (예 :'extends Directory')를주지 않더라도 모든 일반 메소드에 대한 선언을 가져야합니다. – ColinD

4

글쎄, 당신은 일반적으로 방법 자체를 변경하여 캐스트를 피할 수 : 다음

public <T extends Directory> T getDirectory(Class<T> type) 

를 실행 한 다음, 여기에

MyDirectory directory = getDirectory(MyDirectory.class); 

당신이 인수에서 형식 유추를 사용하는 유형을 결정하기 위해 T.

하지만 당신은 그렇지에서 시작된다 삭제를 입력하는 방법보다 종류의 삭제의 내용과 거의 들어 :(

의 인스턴스를 생성하는 유형을 알 수 없습니다로의 Class<T>을 통과해야합니까 자바 제네릭과 관련된 다른 모든 것들에 대해서는 Angelika Langer의 Java Generics FAQ을 참조하십시오.

+0

감사합니다. Jon, 그 FAQ를 읽어 보겠습니다. –