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.