>Java >java지도 시간 >목록에 요소를 추가할 수 없는 이유

목록에 요소를 추가할 수 없는 이유

Susan Sarandon
Susan Sarandon원래의
2024-12-18 09:05:10619검색

Why Can't I Add Elements to a List

목록 이해 데이터 구조

Java에서는 제네릭과 함께 와일드카드 사용의 한계를 이해하는 것이 중요합니다. List:

List<? extends Number> foo3 = new ArrayList<Integer&gt();

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을 가리킬 수 있으므로 정수 추가는 금지됩니다. 마찬가지로 foo3이 List를 참조할 수 있으므로 Double을 추가하는 것은 금지됩니다.

추상화 보장

본질적으로 List 읽기만 가능하고 T 또는 T의 하위 클래스를 얻도록 보장합니다. 목록의 특정 유형을 보장할 수 없으므로 목록에 안전하게 추가할 수 없습니다.

반면에 List< ;? 슈퍼 T> 유형 안전성을 위반하지 않고 목록이 해당 값을 보유할 수 있다는 것을 확신할 수 있으므로 유형 T 또는 해당 하위 클래스의 값을 추가할 수 있습니다.

예: Collections.copy() 이해

고려하세요. Collections.copy()의 서명:

public static <T> void copy(List<? super T> dest, List<? extends T> src)

src에 대한 와일드카드(? 확장 T)가 어떻게 허용되는지 확인하세요. T 유형 또는 그 하위 클래스의 값을 보유하는 목록을 전달하여 src에서 생성된 값이 T 유형 또는 그 하위 클래스가 되도록 보장합니다. 이를 통해 메소드는 다양한 목록 유형을 처리하고 값을 안전하게 복사할 수 있습니다.

결론

제네릭과 함께 와일드카드 사용의 한계를 이해하는 것은 강력한 Java 코드를 작성하는 데 필수적입니다. 목록<에 추가할 수 없다는 점을 기억하시나요? T> 왜냐하면 그것이 가리키는 목록의 특정 유형을 보장할 수 없기 때문입니다. 대신, 읽기만 할 수 있으며 T` 유형 또는 해당 하위 클래스의 값을 얻을 수 있습니다.

위 내용은 목록에 요소를 추가할 수 없는 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.