2013-12-19 2 views
0

몇 가지 공통 논리를 수행해야하는 추상 슈퍼 서비스가 있습니다. 여러 서비스가이 슈퍼 서비스를 구현합니다. 나는 조건에 기반하여 ServiceImpl을 선택했고, 나중에 공통 논리를 실행하기 위해 그것을 추상 유형에 할당하려고한다.형식 매개 변수를 사용하는 일반 메서드를 만드는 방법은 무엇입니까?

다음과 같은 문제점이 있습니까? 예 : FirstResponse과 같이 BaseResponse의/extends 오브젝트를 process() 메소드로 전달하고 싶습니다.

//superservice 
abstract class AbstractService<T extends BaseResponse> { 
    public void process(T t) { 
     //execute logic that is common to a BaseResponse 
    } 
} 

//implementations 
class FirstService extends AbstractService<FirstResponse extends BaseResponse> { 
} 

//usage 
AbstractService<? extends BaseResponse> myservice = new FirstService(); //chose by condition 
myservice.process(new FirstResponse()); //ERROR 

결과 :

The method build(capture#2-of ? extends BaseResponse) 
in the type AbstractService<capture#2-of ? extends BaseResponse> is not applicable for the arguments (FirstResponse) 
+0

합니까'FirstService' 일하는' BaseResponse' 또는'BaseResponse'의 서브 클래스이거나 특정 서브 클래스입니까? – Bohemian

+0

'AbstractService myservice = new FirstService()'트릭을 그렇게해야합니까? –

+0

'FirstService'는'BaseResponse'와 함께 작동합니다; '? super'는'myservice.process()'를 호출 할 수있게 만들지 만, 더 이상 'FirstService'를 할당 할 수 없습니다 ... – membersound

답변

3
//execute logic that is common to a BaseResponse 

그런 경우에는 상속이 제공하는 유연성이 충분하다, 당신이 정말로 제네릭 필요하지 않습니다.

public void process(BaseResponse t) { 
    // ... 
} 

오류의 이유는 자바 컴파일러는 myserviceAbstractService<? extends BaseResponse> 것을 알고 있다는 것입니다. 나중에 다른 서브 클래스에 myservice를 재 할당하는 것은 잘못되지 않습니다 :

AbstractService<? extends BaseResponse> myservice = new FirstService(); 
myservice = new SecondService(); // <---------- should be ok 
myservice.process(new FirstResponse()); // <--- making this bad 

아마 진정한 오류 일 것이다. 당신이 process(T)의 인터페이스를 유지해야하는 경우에는 다음 myservice의 유형을 변경해야합니다 :

FirstService myservice = new FirstService(); 
myservice.process(new FirstResponse()); 
2

당신은이 같은 제네릭을 할 수있는 :와

abstract class AbstractService<T extends BaseResponse> { 
    public void process(T t) { 
     //execute logic that is common to a BaseResponse 
    } 
} 

//implementations 
class FirstService extends AbstractService<FirstResponse> { 
    @Override 
    public void process(FirstResponse firstResponse) { 
     super.process(firstResponse); 
     ... 
    } 
} 

public static void main(String[] args) { 
    //usage 
    AbstractService<FirstResponse> myservice = new FirstService(); 
    myservice.process(new FirstResponse()); 
} 
+0

그러나이 예제에서는 다음과 같이 작성할 수 없습니다 :'AbstractService myservice = new SecondService() ;'class SecondService '인 경우. 조건에 따라 서비스를 선택하고 서비스가 무엇이든간에 'myservice.process'를 실행하고 싶습니다. – membersound

+0

체크되지 않은 캐스트는'AbstractService myservice = (AbstractService) new FirstService();'를 생각해 볼 수있는 쉬운 방법입니다. –

관련 문제