Java 일반 컨테이너 컬렉션을 사용하는 방법
Apr 19, 2023 pm 06:10 PM먼저 간단한 예를 들어보겠습니다.
<code>public void testGenerics() {<br> Collection<Number> numbers = new ArrayList<>();<br> numbers.add(1); // ok<br> numbers.add(0.1); // ok<br><br> Collection<? extends Number> numbers2 = new ArrayList<>();<br> // don't work, you don't know which subtype 'numbers2' exactly contains<br> numbers2.add(1); // oops!<br>}<br></code>
이 예는 사실 약간 반인간적입니다. 이런 전환에 대한 대부분의 사람들(나 포함)의 첫 반응은 "당연히 옳습니다"일 것으로 추정됩니다( 이것은 함정입니다), 다음과 같이 말하세요. 내 이해는 다음과 같습니다.
Collection<Number>: 이 컬렉션에는 Integer/Long/Float일 수 있는 모든 Number 유형 개체가 포함되어 있음을 나타냅니다. 왜냐하면 컴파일러는 obj 인스턴스of Number ==를 결정할 수 있기 때문입니다. true;
-
Collection<? 확장 Number>: 이 컬렉션이 Number 유형의 "하위 유형"(Collection<Integer>/Collection<Long>일 수 있음)의 컬렉션 인스턴스임을 나타냅니다. 따라서 number2.add( 1) 컴파일 때문에 작동하지 않습니다. 컴파일러는 Number2에 포함된 요소가 Number의 어떤 하위 유형인지 알지 못하며, UnknownType의 obj 인스턴스 결과를 확인할 수 없습니다. 이 E 유형은 " 표현이 아닌 특정 유형 부모의 여러 하위 유형에 대한 자리 표시자;
-
또 다른 예:
<code>public void testGenerics() {<br> Collection<Number> numbers = new ArrayList<>();<br> Collection<Integer> integers = new ArrayList<>();<br> Collection<? extends Number> numbers2 = new ArrayList<>();<br> <br> numbers2 = integers; // ok<br> numbers2 = numbers; // ok<br> <br> // don't work, Collection<Number> != Collection<Integer><br> numbers = integers; // oops!<br>}<br></code>
로그인 후 복사Integer가 Number를 명확하게 상속하는데 왜
Collection<Number> == Collection<Integer>
-
는 사실이 아닙니다. 다른 예를 살펴보겠습니다.
<code>public void testGenerics() {<br> Collection<Integer> profits = new ArrayList<>();<br> <br> insertSomething(profits); // line 1<br> <br> Integer profit = profits.iterator().next(); // oops! crash<br>}<br><br>private void insertSomething(Collection<Number> numbers) {<br> numbers.add(Long.MAX_VALUE);<br>}<br></code>
로그인 후 복사라인 1이 설정되면 다음 이익은 음수가 되며 일련의 후속 계산은 코드가 충분히 강력하지 않으면 비정상적으로 들립니다. 예상치 못한 RuntimeException이 발생하여 메소드가 비정상적으로 종료되거나 프로그램이 충돌할 수도 있습니다.
한 문장으로 말하면 Collection<Number> != Collection<Integer>은 런타임 안전을 위한 것이며 가능한 유형 변환 예외는 컴파일 타임에 해결됩니다.
이제 Collection<Object>와 Collection<?>에 대해 이야기해 보겠습니다. 저를 포함한 많은 사람들의 첫 번째 반응은 "
Object는 모든 Java 개체의 공통 상위 클래스이므로 Collection<Object> ." 유형의 컬렉션, 예를 살펴보겠습니다.
<code>public void testGenerics2() {<br> Collection<Integer> integers = new ArrayList<>();<br><br> Collection<?> objects2 = integers; // ok<br> // don't work, which type of 'objects2' contains is uncertain<br> objects2.add(1); // oops!<br> <br> Collection<Object> objects = integers; // oops!<br>}<br></code>
Collection<?>은 Collection<Object>보다 더 큰 범위를 나타냅니다;;
컴파일러가 정확하게 호출할 수 없기 때문에 object2.add(1)을 호출할 수 없습니다. 어떤 데이터 유형 컨테이너 object2가 런타임 유형 변환 예외를 일으킬 수 있는지 추론합니다.
모든 데이터 유형의 컬렉션을 작성하는 올바른 방법은 Collection<?>입니다.
Collection<Object> 유형의.
-
Collection<code>public void testGenerics() {<br> Collection<Integer> integers = new ArrayList<>();<br><br> Collection<Object> objects = integers; // oops!<br> // don't work, which type of 'objects2' contains is uncertain<br> objects.add("1");<br><br> Integer one = objects.iterator().next(); // oops! crash<br>}<br></code>
로그인 후 복사
Collection
Collection<?> UnknownType의 obj 인스턴스 결과를 판단할 수 없습니다. ;
? 알 수 없는 유형을 나타내고 Object는 알려진 유형을 나타냅니다.
머피의 법칙에 따라 Collection<Object> 일어날 것이다. . (또 다른 온라인 결함)
위 내용은 Java 일반 컨테이너 컬렉션을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까?
