2016-07-21 7 views
4

나는 일반적인 정적 팩토리 메소드와 setter 메소드와 클래스 MyClass<T> 있습니다 setter 메소드와자바 제네릭 : 호환되지 않는 유형

public class MyClass<T> { 
    public static <T> MyClass<T> with(Context context) { 
     MyClass<T> myClass = new MyClass<>(); 
     myClass.context = context; 
     return myClass; 
    } 
    public void setClass(Class<? extends CustomClass<T>> customClass) { 
     ... 
    } 
    ... 
} 

, 사용자는 "에서는 CustomClass"에서 확장하는 모든 클래스를 설정할 수 있습니다.

지금까지 그렇게 좋았습니다. 내가하는 경우 :

MyClass<String> myClass = MyClass.with(this); 
myClass.setClass(MyCustomClass.class); 

완벽하게 작동합니다. 하지만 내가하는 일 :

MyClass.with(this).setClass(MyCustomClass.class); 

컴파일되지 않습니다. 컴파일러는 다음을 출력합니다.

Error:(44, 87) error: incompatible types: Class<MyCustomClass> cannot be converted to Class<? extends MyCustomClass<Object>> 

왜 두 번째 옵션으로 컴파일하지 않을 지 모르겠다.

public class MyCustomClass extends CustomClass<String> 

답변

5

당신이 당신의 작업 예 및 컴파일 오류가 당신의 한 줄 사이에 누락 된 정보를 가지고 있습니다 : MyCustomClass은 같다.

전문 분야를 알지 못합니다.

MyClass.<String>with(this).setClass(MyCustomClass.class); 

과 같이해야합니다. 그러면 '이야기하는 문자열'을 알 수 있습니다.

+0

감사합니다 당신을 너무 많이! 작동 중! –

1

두 번째 문에서는 T을 정의하지 않으므로 컴파일러는 setClass의 제한으로 인해 컴파일 할 수 없습니다.

public static <T> MyClass<T> with(Object context, Class<T> clazz) { 
    MyClass<T> myClass = new MyClass<>(); 
    myClass.context = context; 
    return myClass; 
    } 

MyClass.with(this, String.class).setClass(MyCustomClass.class); 

또는 통과 :

당신은 변수 목적으로 with 기능에 T를 추가해야

MyClass.<String>with(this).setClass(MyCustomClass.class); 
+0

정말 고마워요! 이 솔루션은 또한 작동합니다! –