Java java지도 시간 Java 일반 컨테이너 컬렉션을 사용하는 방법

Java 일반 컨테이너 컬렉션을 사용하는 방법

Apr 19, 2023 pm 06:10 PM
java collection

먼저 간단한 예를 들어보겠습니다.

<code>public void testGenerics() {<br>    Collection&lt;Number&gt; numbers = new ArrayList&lt;&gt;();<br>    numbers.add(1); // ok<br>    numbers.add(0.1); // ok<br><br>    Collection&lt;? extends Number&gt; numbers2 = new ArrayList&lt;&gt;();<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&lt;Number&gt; numbers = new ArrayList&lt;&gt;();<br>    Collection&lt;Integer&gt; integers = new ArrayList&lt;&gt;();<br>    Collection&lt;? extends Number&gt; numbers2 = new ArrayList&lt;&gt;();<br>    <br>    numbers2 = integers; // ok<br>    numbers2 = numbers; // ok<br>    <br>    // don't work, Collection&lt;Number&gt; != Collection&lt;Integer&gt;<br>    numbers = integers; // oops!<br>}<br></code>
    로그인 후 복사
  • Integer가 Number를 명확하게 상속하는데 왜

Collection<Number> == Collection<Integer>

  • 는 사실이 아닙니다. 다른 예를 살펴보겠습니다.

    <code>public void testGenerics() {<br>    Collection&lt;Integer&gt; profits = new ArrayList&lt;&gt;();<br>    <br>    insertSomething(profits); // line 1<br>    <br>    Integer profit = profits.iterator().next(); // oops! crash<br>}<br><br>private void insertSomething(Collection&lt;Number&gt; 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&lt;Integer&gt; integers = new ArrayList&lt;&gt;();<br><br>    Collection&lt;?&gt; objects2 = integers; // ok<br>    // don't work, which type of 'objects2' contains is uncertain<br>    objects2.add(1); // oops!<br>    <br>    Collection&lt;Object&gt; objects = integers; // oops!<br>}<br></code>
로그인 후 복사

Collection<?>은 Collection<Object>보다 더 큰 범위를 나타냅니다;;

  • 컴파일러가 정확하게 호출할 수 없기 때문에 object2.add(1)을 호출할 수 없습니다. 어떤 데이터 유형 컨테이너 object2가 런타임 유형 변환 예외를 일으킬 수 있는지 추론합니다.

  • 모든 데이터 유형의 컬렉션을 작성하는 올바른 방법은 Collection<?&gt입니다.

  • Collection<Object> 유형의.


  • Collection가 어떤 유형의 컬렉션도 나타내지 않는 이유는 무엇입니까? 실제로 컴파일러는 유형 변환 오류가 발생할 위험이 있다고 생각합니다.

    <code>public void testGenerics() {<br>    Collection&lt;Integer&gt; integers = new ArrayList&lt;&gt;();<br><br>    Collection&lt;Object&gt; 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는 컨테이너에 데이터를 추가할 수 있습니다. Object 모든 객체의 상위 클래스이고 알려진 유형이므로

  • Collection<?> UnknownType의 obj 인스턴스 결과를 판단할 수 없습니다. ;


  • ? 알 수 없는 유형을 나타내고 Object는 알려진 유형을 나타냅니다.


  • 머피의 법칙에 따라 Collection<Object> 일어날 것이다. . (또 다른 온라인 결함)

위 내용은 Java 일반 컨테이너 컬렉션을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

자바의 제곱근 자바의 제곱근 Aug 30, 2024 pm 04:26 PM

자바의 제곱근

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

자바의 완전수

Java의 난수 생성기 Java의 난수 생성기 Aug 30, 2024 pm 04:27 PM

Java의 난수 생성기

자바의 암스트롱 번호 자바의 암스트롱 번호 Aug 30, 2024 pm 04:26 PM

자바의 암스트롱 번호

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

자바의 웨카

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 스미스 번호

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

Java Spring 인터뷰 질문

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

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

See all articles