Java Generics에서 'super'와 'extends'의 차이점은 무엇입니까
이 질문에 이미 답변이 있습니다.
- <? 슈퍼 T>와 <? Java 14 답변 에서 T> 확장
Java 제네릭을 배우려고합니다. 언제 사용 <T extends Foo>
할지, 언제 사용할지 명확하지 않습니다 <T super Foo>
. 이들 각각은 T에 대해 무엇을 의미합니까? I have <T extends Comparable>
and <T super Comparable>
, 이들 각각은 무엇을 의미합니까?
sun.com에서 여러 자습서를 읽었지만 여전히 길을 잃었습니다. 누군가 예를 들어 설명 할 수 있습니까?
감사!
효과적인 Java 2nd Edition, 항목 28을 참조하십시오.
PECS
P roducer의 전자 xtends, C onsumer S uper
매개 변수가 생산자 인 경우이어야 <? extends T>
하고 소비자 인 경우 이어야 합니다 <? super T>
.
Google Collections를 살펴보면 Bloch가 있으므로 사용 방법을 알고 있습니다.)
허용하는 상속 계층 구조에 따라 다릅니다. "Grandparent"에서 상속 된 "Parent"에서 상속 된 "Child"클래스가 있다고 가정합니다.
<T extends Parent>
<T super Parent>
부모 또는 조부모 를 받아들이는 동안 부모 또는 자식을 받아들입니다.
세 가지 유형의 와일드 카드가 있습니다.
? extends Type
: 유형의 하위 유형 패밀리를 나타냅니다Type
. 가장 유용한 와일드 카드입니다.? super Type
: 유형의 상위 유형 패밀리를 나타냅니다Type
.?
: 모든 유형 또는 임의의 집합을 나타냅니다.
저에게 가장 좋은 대답은 밥 삼촌의 기사를 읽을 때 @BSingh에서 나왔습니다. 여기서 기사의 결론을 다시 시작합니다.
목록 에 쓸 때마다 List <T super Suit>를 사용하세요 .
객체를 목록에 넣을 때 관심있는 것은 객체가 목록이 보유한 유형과 호환되는 유형이라는 것입니다. 따라서 목록이 해당 객체의 유형 또는 해당 객체의 수퍼 클래스를 취하기를 원합니다.
목록 에서 읽을 때마다 List <T extends Suit>를 사용하십시오 .
반면에 목록에서 읽을 때 읽고있는 유형이 목록에 포함 된 유형이거나 해당 유형에서 파생 된 유형이되기를 원합니다.
유형 매개 변수에 대해 묻는 경우 <T super X>
Java 에는 구성 이 없습니다 . 바인딩 된 매개 변수는에만 가능 extend
하지만 둘 이상의 유형을 확장 할 수 있습니다. 예
public class MyClass< T extends Closeable & Runnable >
{
// Closeable and Runnable are chosen for demonstration purposes only
}
이 경우에는 MyClass< ConcreteT >
ConcreteT를 다음과 같이 선언해야합니다.
public class ConcreteT
implements Closeable, Runnable
{
...
}
제한된 와일드 카드의 경우이 문서를 읽어 보세요. get-put 원칙 에 대한 섹션을 읽으십시오 . 기본적으로, super
에 대응하는 write
의미와 extends
에 대응하는 read
시맨틱.
PECS를 기억하십시오-생산자는 소비자 지원을 확장합니다. 또한 Bob 삼촌은 그의 장인 시리즈에서 잘 설명합니다. http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf를 확인하십시오.
'IT박스' 카테고리의 다른 글
Backbone.js REST 호출 이해 (0) | 2020.10.13 |
---|---|
자동 완성이 android sdk에서 작동을 중지했습니다. (0) | 2020.10.13 |
iOS 7 원형 프레임 버튼 (0) | 2020.10.13 |
PEAR를 통해 PHPUnit 설치 (0) | 2020.10.13 |
Excel에서 열의 행을 하나의 셀로 병합하는 방법은 무엇입니까? (0) | 2020.10.13 |