get-put 원리에 대한 설명


82

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

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

예외 는 다음과 같습니다.

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

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

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


4
+1 : 사람이 된 기초에 대한 설명 찾아 볼 수 항상 좋은
모두

2
@ 여러분, 나는 당신이 등쪽이 아닌 근본적인 의미의 기초를 의미한다고 생각합니까?
Rich Seller

답변:


164

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

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

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


그러나 Collection <? extends Fruits>에서 과일을 가져 오는 동안 바나나가 아닌 과일을 얻을 수 있습니다. 여기에 과일을 넣어 동안 마찬가지로, u는 바나나 과일에 속하지 수있는 모든 것을 추가 할 수 있습니다
JavaResp

6
Java는 Collection<? extends Fruit>정확히 그 이유 때문에에 null 이외의 다른 것을 추가하는 것을 방지하며 , 정확히 그러한 이유 때문에 항목을 가져온 결과를 명시 적으로 캐스팅해야합니다.
Jon Skeet

@JonSkeet 이것은 어리석은 질문 일 수 있지만, 어떤 경우에 add ()와 get () 메소드 모두에 "액세스"하지 않는 것이 유용합니까? 목록에서 어떤 객체를 가져 오려면 먼저 추가해야합니다. 맞죠? 그리고 vica versa, 나중에 얻을 수 없다면 왜 추가하겠습니까?
Timmos

7
@Timmos : 무언가 가 값을 추가 할 수 있어야한다고해서 모든 코드가 할 수 있어야 한다는 의미는 아닙니다 . 예를 들어, 사람 이름 목록을 표시하려면 Collection<? extends Person>(또는 아마도 Iterable<? extends Person>,하지만 ...) 가 필요할 수 있습니다 . 코드 생성 이 컬렉션 그것은을해야 잘 할 수 Collection<Employee>있지만, 소모 코드는하지 않습니다.
Jon Skeet

5
@Timmos : 이 경우 "그것"이 의미하는 바를 정확히 말해야 합니다 .하지만 예, Java 제네릭의 규칙은 형식 안전성을 제공하도록 설계되었습니다.
Jon Skeet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.