내 문제 수있는이 조각으로 표현하는 접속 수 :제네릭 오른쪽 유형으로 변환
이public interface TheClass<T> {
public void theMethod(T obj);
}
public class A {
private TheClass<?> instance;
public A(TheClass<?> instance) {
this.instance = instance;
}
public void doWork(Object target) {
instance.theMethod(target); // Won't compile!
// However, I know that the target can be passed to the
// method safely because its type matches.
}
}
내 클래스 A
알 수없는 그 제네릭 유형 TheClass
의 인스턴스를 사용을. TheClass
인스턴스는 모든 클래스로 매개 변수화 될 수 있기 때문에 Object
으로 전달 된 대상이있는 메서드가 있습니다. 그러나 컴파일러는 정상적인이 같은 대상을 전달할 허용하지 않습니다.
이 문제를 피하려면 어떻게해야합니까?
더러운 솔루션은 ... 잘 작동하지만, 의미 론적으로 잘못 TheClass<? super Object>
로
내가 전에 사용, 원시 형식으로 만 TheClass
을 인스턴스를 선언하는 것이었다 또 다른 해결책을 인스턴스를 선언하는 것입니다,하지만 나쁜 연습, 그래서 내 실수를 바로 잡으려고.
해결
public class A {
private TheClass<Object> instance; // type enforced here
public A(TheClass<?> instance) {
this.instance = (TheClass<Object>) instance; // cast works fine
}
public void doWork(Object target) {
instance.theMethod(target);
}
}
왜 'A'도 입력하지 않으시겠습니까? –
+1, 좋은 질문입니다! 답변을 기다리는 중 ... – aProgrammer
A는 많은 사람들이 사용하는 오픈 소스 라이브러리의 일부이며 A를 입력하면 강력한 API 중단을 의미합니다. 나는 최근에 "TheClass"인스턴스에 원시 타입을 사용했기 때문에이 문제를 발견했습니다. 왜냐하면 나는 그것이 나쁜 개념이라는 것을 알지 못했기 때문입니다. 그것은 정상적으로 작동했지만 나쁜 습관으로 간주되어 오용을 바로 잡으려고합니다. –