아래 SCCE는 인터페이스 마커를 구현하는 2 개의 클래스 (B 및 C)를 보여줍니다. Marker를 구현하는 각 클래스에는 일반 Handler 인터페이스 (B_Handler, C_Handler)를 구현하는 해당 클래스가 있습니다. 맵은, Pair.second의 Class 형을 관련 지을 수 있던 Handler에 관련 짓기 위해서 (때문에) 사용됩니다. 코드는 예상대로 실행됩니다. 그러나 컴파일 타임 경고가 나타납니다 :Java Generics 와일드 카드 캡처 경고
경고 : [선택하지 않음] 체크되지 않은 캐스트 처리기 h1 = (처리기) (dispatch.get (p1.second.getClass())); 필수 : 처리기 발견 : 처리기 여기서 CAP # 1은 새로운 유형 변수입니다. CAP # 1 캡처에서 마커를 확장합니까? extends Marker
@SuppressWarnings (value = "unchecked") 외에이 문제를 해결하는 가장 확실한 방법은 무엇입니까? 여기
List<? extends List> test1 = new ArrayList<>();
List<List> test2 = (List<List>) test1;
우리가 경고를 얻을 :
package genericpair;
import java.util.HashMap;
import java.util.Map;
import javax.swing.SwingUtilities;
public class GenericPair
{
public class A
{
}
public interface Marker
{
}
public class B implements Marker
{
}
public class C implements Marker
{
}
public Pair<A, Marker> getTarget()
{
A a = new A();
C c = new C();
return new Pair<>(a, c);
}
public interface Handler<T extends Marker>
{
void handle(Pair<A, T> target);
}
public class B_Handler implements Handler<B>
{
@Override
public void handle(Pair<A, B> target)
{
System.out.println("B");
}
}
public class C_Handler implements Handler<C>
{
@Override
public void handle(Pair<A, C> target)
{
System.out.println("C");
}
}
public class Pair<F, S>
{
public final F first;
public final S second;
public Pair(F first, S second)
{
this.first = first;
this.second = second;
}
}
private void executeSCCE()
{
// register a handler for each Marker type
Map<Class, Handler<? extends Marker>> dispatch = new HashMap<>();
dispatch.put(B.class, new B_Handler());
dispatch.put(C.class, new C_Handler());
// get a target (e.g., Pair<A,C>)
Pair<A, Marker> p1 = getTarget();
// select handler based on the class type of the second parameter
Handler<Marker> h1 = (Handler<Marker>) (dispatch.get(p1.second.getClass()));
h1.handle(p1);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(() -> new GenericPair().executeSCCE());
}
}