Java에서는 제네릭과 함께 와일드카드 사용의 한계를 이해하는 것이 중요합니다. List:
List<? extends Number> foo3 = new ArrayList<Integer>();
foo3에 정수를 추가하려고 하면 다음과 유사한 오류가 발생할 수 있습니다.
The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (ExtendsNumber)
와일드카드 ? Number in List foo3은 foo3이 Number를 확장하는 유형 계열의 값을 보유할 수 있음을 의미합니다. 이는 다음 할당이 모두 유효함을 의미합니다.
List<? extends Number> foo3 = new ArrayList<Number>(); // Number extends Number List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
그러나 이러한 유연성이 주어지면 무결성을 위반하지 않고 foo3에 어떤 종류의 객체를 추가할 수 있는지 확실하게 결정하는 것이 불가능해집니다. foo3이 List
본질적으로 List T> 읽기만 가능하고 T 또는 T의 하위 클래스를 얻도록 보장합니다. 목록의 특정 유형을 보장할 수 없으므로 목록에 안전하게 추가할 수 없습니다.
반면에 List< ;? 슈퍼 T> 유형 안전성을 위반하지 않고 목록이 해당 값을 보유할 수 있다는 것을 확신할 수 있으므로 유형 T 또는 해당 하위 클래스의 값을 추가할 수 있습니다.
고려하세요. Collections.copy()의 서명:
public static <T> void copy(List<? super T> dest, List<? extends T> src)
src에 대한 와일드카드(? 확장 T)가 어떻게 허용되는지 확인하세요. T 유형 또는 그 하위 클래스의 값을 보유하는 목록을 전달하여 src에서 생성된 값이 T 유형 또는 그 하위 클래스가 되도록 보장합니다. 이를 통해 메소드는 다양한 목록 유형을 처리하고 값을 안전하게 복사할 수 있습니다.
제네릭과 함께 와일드카드 사용의 한계를 이해하는 것은 강력한 Java 코드를 작성하는 데 필수적입니다. 목록<에 추가할 수 없다는 점을 기억하시나요? T> 왜냐하면 그것이 가리키는 목록의 특정 유형을 보장할 수 없기 때문입니다. 대신, 읽기만 할 수 있으며 T` 유형 또는 해당 하위 클래스의 값을 얻을 수 있습니다.
위 내용은 목록에 요소를 추가할 수 없는 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!