제네릭 및
Java에서 제네릭은 더 넓은 범위의 유형에 대해 유형이 안전한 작업을 허용합니다. 그러나
Map<String, Class<? extends Serializable>> expected = null; Map<String, Class<java.util.Date>> result = null; assertThat(result, is(expected));
이 코드는 AssertThat 메소드에 전달된 잘못된 인수 유형으로 인해 컴파일에 실패합니다. 이는 Matcher T> Matcher
공분산은 하위 유형이 상위 유형에 안전하게 할당될 수 있음을 의미합니다. 즉, Class 직렬화 가능> 객체는 Class T> 물체. 그러나 그 반대는 사실이 아닙니다. Class T> 개체를 클래스에 할당할 수 없습니다 직렬화 가능> object.
이는 공분산이 포함된 유형 인수가 아닌 유형 매개변수 자체에만 적용되기 때문입니다. 우리의 예에서 java.util.Date는 직렬화 가능의 하위 유형이지만 Class 직렬화 가능> 반드시 Class<의 하위 유형일 필요는 없습니다. 확장 날짜>.
assertThat 메소드의 서명을 Matcher<로 변경합니까? T> 실제 유형의 하위 유형과 일치하는 일치자를 허용하여 이 문제를 해결합니다. 이는 코드 조각과 같은 상황에 필요한 유연성을 제공합니다.
그러나
assertThat 메서드의 일반성과 관련하여 이 메서드를 사용하면 사용된 일치자가 결과 유형과 호환되는지 확인하기 위한 유형 검사가 가능합니다. 이는 런타임 오류 가능성을 완전히 제거하지는 않지만 호환되지 않는 일치를 방지하여 안전성을 높입니다.
위 내용은 Java Generics에서 언제 `` vs. ``를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!