Effective Java 2 판 23 항을 연구하면서 혼합 개체의 인수 목록이있는 원시 컬렉션이있는 생성자로 개체를 인스턴스화하려고했습니다. 컴파일러가 생성자에 원시 형식을 전달하려고 시도하고 있다고 생각했습니다. 그러나 컴파일러는 "호출자가 아닌 호출 수신자"라는 확인되지 않은 예외 경고 만 제공합니다.개체 인스턴스화 이전에 매개 변수화 된 형식의 유효성을 확인하는 방법
클래스가 잘 컴파일되어 새로운 코드에서 원시 타입을 사용하지 않도록 Josh Bloch의 진술을 지원합니다. 이것이 컴파일 된 사실은 조금 불안합니다.
Q? 생성자에서 객체 유효성을 수동으로 확인해야하는 것보다 객체를 인스턴스화하기 전에 클래스의 유형 안전성을 보장 할 수있는 방법은 무엇입니까? 다음은 "호출자 ... 기본"에서 확인되지 않은 할당 경고 만 제공했습니다. 어떻게 방어자가이를 방지 할 수 있습니까? 그들이 도입하기 전에, 당신은 어디 입력 된 모음이 예상되는 유형이 지정되지 않은 모음을 사용하여 작성된 코드와 자바 제네릭 호환되도록하기 위해
public class RawType {
private final Collection<Example> example;
public RawType(Collection<Example> example) {
this.example = example;
}
public Collection<Example> getExample() {
return example;
}
public static void main(String[] args) {
Collection unsafe = new ArrayList();
unsafe.add(new Example());
unsafe.add(new Corruption());
unsafe.add(new Example());
RawType rawType = new RawType(unsafe); // Corruption
for(Object type : rawType.getExample()) {
System.out.println(type.getClass().getName()); // Mixed Classes...
}
}
static class Corruption {}
static class Example{}
}
이러한 상황을 피하기 위해 경고를 무시하지 마십시오. – Braj
"callee"(생성자)에 경고가 없으므로 경고가 없습니다. 문제는 적절한 제네릭 형식을 사용해야하는 원시 형식을 사용하는 호출자입니다. 피 호출자 측에서도 경고를하기 위해서는 "이 생성자/메서드는 다른 곳에서 올바르게 사용되지 않습니다."라는 말을해야합니다. – kajacx
나는 분명히 "The Caller, in main"API를 만들고 누군가가 원시 타입을 보내고 있다고 생각합니다 ... 수동 검증없이 어떻게 방어 할 수 있습니까? 그것은 질문입니다. –