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

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

WBOY
WBOY앞으로
2023-04-19 18:10:42758검색

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

<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: 이 컬렉션에는 Integer/Long/Float일 수 있는 모든 Number 유형 개체가 포함되어 있음을 나타냅니다. 왜냐하면 컴파일러는 obj 인스턴스of Number ==를 결정할 수 있기 때문입니다. true;

  • Collection: 이 컬렉션이 Number 유형의 "하위 유형"(Collection/Collection일 수 있음)의 컬렉션 인스턴스임을 나타냅니다. 따라서 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 == Collection

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

    <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 != Collection은 런타임 안전을 위한 것이며 가능한 유형 변환 예외는 컴파일 타임에 해결됩니다.

이제 Collection와 Collection에 대해 이야기해 보겠습니다. 저를 포함한 많은 사람들의 첫 번째 반응은 "

Object는 모든 Java 개체의 공통 상위 클래스이므로 Collection .

" 유형의 컬렉션, 예를 살펴보겠습니다.

<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보다 더 큰 범위를 나타냅니다;;

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

  • 모든 데이터 유형의 컬렉션을 작성하는 올바른 방법은 Collection

  • Collection 유형의.


  • 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는 컨테이너에 데이터를 추가할 수 있습니다. Object 모든 객체의 상위 클래스이고 알려진 유형이므로