2014-03-13 2 views
0

나는 Spring Batch를 배우려고하고 있으며,이 책은 인터페이스 클래스 예제를 제공하지만 명명 규칙은 저를 버리고 있습니다.태그 <> 인터페이스 클래스 이름 내에

public interface ItemProcessor<I,O> { 
O process(I item) throws Exception; 

}

는 내가 전에 클래스 이름의 매개 변수를 본 적이 없다. 그들은 실제적인 목적을 위해 봉사 하는가 아니면 단지 가이드 역할을 할 수 있는가? 클래스 이름이 변경된 경우 다음 코드는 어떻게 다릅니 까?

public interface ItemProcessor { 
O process(I item) throws Exception; 

}

+5

일반 인터페이스입니다. 이에 대한 자세한 내용은 [여기] (http://docs.oracle.com/javase/tutorial/java/generics/)에서 시작하십시오. –

+0

감사합니다. – Serge

답변

7

당신은 약 generics을 말하고있다.

IO은 해당 클래스의 일반 매개 변수입니다.

ItemProcessorItemProcessorI이고 O s "라고 생각할 수 있습니다.

제네릭 작동 방식에 대한 힌트를 얻는 가장 간단한 방법은 클래스 Box을 생각하는 것입니다.

지금은 무엇입니까? 입니까?

class Box<? extends Number> 

은 ... Number s의 Box입니다.

다른 말했듯이
1

상기 <> (S)의 내부 식별자 ItemProcessor 제네릭을 사용하는 것을 나타낸다.

두 번째 코드 예제는 전혀 컴파일되지 않습니다. 인터페이스 정의에서 I & O가 누락되면 "프로세스"메소드 선언에 해당 요소가있어 컴파일 오류가 발생합니다. 당신이 ItemProcessor의 인스턴스를 만들 때

, 당신과 같이 그 일반적인 자리에 구체적인 클래스를 제공 할 것입니다 :

ItemProcessor<String, Integer> processor = new ConcreteItemProcessor<String, Integer>(); 
Integer result = processor.process("hello world"); 

또는 가능성, 당신이 실제로 ItemProcessor < 문자열, 정수의 구현으로 ConcreteItemProcessor를 선언 할 것 그 클래스 정의에 >, 인스턴스화가 조금 짧아 질 수 있도록 : 당신은 문자열과 정수에 시도의 프로세서와 같은 프로세서를 선언하기 때문에

ItemProcessor<String, Integer> processor = new ConcreteItemProcessor(); 

다른 종류의 객체를 사용하면 컴파일 오류가 발생합니다. 당신이 원하는! 제네릭이 나오기 전에 진정한 "일반적인"인터페이스를 만들 수있는 유일한 방법은 ItemProcessor를 프로세스로 만들고 "Objects"또는 유사한 것을 반환하는 것입니다. 그러면 컴파일 될 것이지만 우연히 잘못된 것을 전달한 경우 런타임 오류가 발생할 수 있습니다. 이 방법을 사용하면 오류를 더 빠르게 catch 할 수 있지만 코드를 좀 더 장황하게 만들어야합니다.