2017-03-20 1 views
0

JAVA의 제네릭에 매달려있는 매우 일반적인 유스 케이스가 있는데 어떻게 사용할 수 없는지 집중하지 못합니다.구현에서 일반 유형의 인터페이스에서 일반 유형

다음 예제는 인터페이스에서 일반 유형을 생성하여 구현 방법과 함께 제네릭 유형으로 추가 전달할 수 없음을 보여줍니다.

interface MyInterface <T, I, O> 
{ 
    public T method(T arg); 
}  

abstract class MyAbstractClass <I , O> implements MyInterface<List<?>, I , O> 
{ 
    // This cause a syntax-failure! What is wrong with this? 
    // And how can I manage my Generics like this? 
    @override 
    public abstract List<O> method(List<I> arg); 
} 

class MyImplementation extends MyAbstractClass <String , Integer> 
{ 
    List<String> method(List<Integer> arg) 
    { 
     // ... implementation 
    } 
} 
+0

먼저, 인터페이스가 다른 2 종류를 사용하지 않습니다. 둘째, List 을 MyInterface에 전달하고 My 추상 클래스에서 List 및 List 을 각각 사용합니다. 잘못된 것입니다. O 또는 I 등 어느 곳에서나 동일한 유형을 사용해야합니다. – Justas

답변

0

은 당신이 무엇을 원하는이 정말 잘 모르겠지만, 이런 식으로 작동합니다 :

interface MyInterface <T, I, O> 
{ 
    T method(I arg); 
} 

abstract class MyAbstractClass <O, I> implements MyInterface<List<O>, List<I> , O> 
{ 
    @Override 
    public abstract List<O> method(List<I> arg); 
} 

class MyImplementation extends MyAbstractClass <String , Integer> 
{ 
    @Override 
    public List<String> method(List<Integer> arg) { 
     // ... implementation 
    } 
} 
+0

컴파일러에서 인수 형의 오버로딩에 대해서는 강한 체크가 필요하지만 리턴 형에 대해서는 그렇지 않다. 그래서 지나가는 인자의 타입을 정확히 정의해야합니다. 나는 당신이 제안한 유사한 모델로 내 Object를 바꾸기 만합니다. 감사합니다. –