[java] get-put 원리에 대한 설명

나는 O’Reilly의 책을 읽었으며,이 get-put 원리 를 알게되었습니다 .

  • 구조에서 값을 가져 오는extends 경우에만 와일드 카드를 사용하십시오 .
  • 구조 super에만 값을 입력 할 때 와일드 카드를 사용하십시오 .
  • 그리고 둘 다 구조에서 가져오고 싶을 때 와일드 카드를 사용하지 마십시오.

예외 는 다음과 같습니다.

  • 모든 참조 유형에 속하는 extendsvalue를 제외하고 와일드 카드로 선언 된 유형에는 아무것도 넣을 수 없습니다 null.

  • 모든 참조 유형의 수퍼 유형 인 supertype 값을 제외하고 와일드 카드로 선언 된 유형에서 아무것도 가져올 수 없습니다 Object.

누구든지이 규칙을 깊이 탐구하도록 도와 줄 수 있습니까? 가능하면 계층 적으로 넣어주세요.



답변

바나나 다발을 고려하십시오. 이것은 Collection<? extends Fruit>특정 종류의 과일 모음이라는 점에서입니다. 그러나 여러분은 그것이 어떤 종류의 과일 모음인지 알지 못합니다. 당신은 그것으로부터 항목을 얻을 수 있고 그것이 확실히 과일이 될 것이라는 것을 알 수는 있지만 그것에 추가 할 수는 없습니다. 당신은 바나나 무리에 사과를 추가하려고 할 수 있습니다. 이것은 확실히 잘못된 것입니다. 모든 종류의 과일에 유효한 값이 될 것이므로 추가 할 수 있습니다 .null

이제 과일 그릇을 고려하십시오. 이것은 Collection<? super Banana>“보다 큼” Banana(예 : Collection<Fruit>또는 Collection<TropicalFruit>) 유형의 컬렉션이라는 점에서입니다 . 당신은 할 수 확실히 이에 바나나를 추가 할 수 있지만 당신은 그릇에서 항목을 가져 오는 경우에 당신은 당신이 얻을 것이다 모르는 – 그것은 잘 수 없습니다 바나나합니다. 당신이 확실히 아는 것은 그것이 유효한 (아마도 null) Object참조 가 될 것이라는 것입니다 .

(일반적으로 Java 제네릭 질문의 경우 Java Generics FAQ 는 던질 가능성이있는 제네릭 관련 거의 모든 것에 대한 답변을 포함하는 훌륭한 리소스입니다.)


답변