<? extends Object>
과 <E extends Object>
의 차이점은 무엇입니까? 언제 다른 것을 사용해야합니까?<무엇입니까? Object> 및 <E extends Object>를 확장합니까?
답변
<? extends Object>
는 E
는 Object
를 확장하는 파라미터 화 된 형태)을 요구한다 (<E extends Object>
반면, 경계 타입, Object
을 연장 경계 와일드 (미지이다. 의
대부분의 미묘한 차이가 파라미터 상부에서 와일드 카드을 경계 범위 :
일반 형식 클래스를 만들 때 바인드 된 와일드 카드를 사용할 수 없으며 형식화 된 매개 변수 만 만들 수 있습니다. 허용됩니다.
바운드 와일드 카드는 알 수없는 형식이므로 컬렉션에 항목을 추가해야하는 곳에서 사용할 수 없으며 컬렉션에서받는 형식을 알 수 없으므로 형식 안전하지 않습니다 .
바인딩 된 와일드 카드는 여러 제네릭 형식 (경계)에 바인딩 할 수 없습니다.
이 정보가 도움이되기를 바랍니다.
둘 다' 확장 객체>'와'
사실, 저는 2와 2의 차이를 만들기 위해 편집을했습니다 ... –
실제로 아이템을 추가해야하는 곳에서 와일드 카드를 사용합니다 와일드 카드가 슈퍼 SomeClass> –
나중에 유형을 참조해야하는 경우 E
을 사용하십시오. 다시 유형을 참조 할 필요가없는 경우 ?
을 사용하십시오.
<E>
은 형식 인수를 선언합니다.
제네릭 형식 또는 메서드를 만들 때만 사용할 수 있습니다.
<? ...>
은 와일드 카드로 형식 인수가 입니다.
닫힌 제네릭 형식을 만들 때만 사용할 수 있습니다.
일반 코드에서 와일드 카드라고하는 물음표 (?)는 알 수없는 형식을 나타냅니다. 와일드 카드는 매개 변수, 필드 또는 로컬 변수의 유형과 같은 다양한 상황에서 사용할 수 있습니다. 때로는 반환 유형으로 사용합니다 (더 구체적으로 프로그래밍하는 것이 더 좋습니다). 와일드 카드는 일반 메소드 호출, 일반 클래스 인스턴스 작성 또는 수퍼 유형에 대한 유형 인수로 절대로 사용되지 않습니다. 추가 정보를 원하시면 여기를 this
을 확인 즉시 내 마음에 오는 약간의 차이가 있습니다
유형 매개 변수의 경계가 여러 범위를 지정할 수 있습니다 -
T extends A & B
,하지만 와일드 카드로 여러 범위를 지정할 수 없습니다 -? extends A & B
이 유효하지 않습니다.와일드 카드 -
? super A
이 유효하지만 type 매개 변수 -T super A
이 유효하지 않은 더 낮은 경계를 가질 수 있습니다.제네릭 형식을 만드는 동안 와일드 카드 범위를 사용할 수 없습니다. 유형 매개 변수 범위를 사용해야합니다.
전달 된 인수의 형식 매개 변수 사이에 어떤 관계가 필요한 경우 메서드 내에서 형식 매개 변수 범위를 사용해야합니다. 예를 들어, 동일한 유형 매개 변수로 두 개의 매개 변수화 된 유형을 전달하려고합니다. 와일드 카드 범위로는이 작업을 수행 할 수 없습니다. 따라서 다음 메소드 선언은
Number
까지 확장되는 동일한 유형 매개 변수의 두 목록을 취합니다. 내가 효과적인 자바에서 몇 가지 포인트를 추가 할 것입니다public <T extends Number> void merge(List<T> list1, List<T> list2) { }
로 종료하려면, - 아이템 28 : 와일드 카드 형식을 사용, 최대의 유연성을 위해
: 사용 API의 유연성을 높이기 위해 와일드 카드를 경계 생산자 또는 소비자를 나타내는 입력 매개 변수. 입력 매개 변수가 제작자와 소비자 인 경우 와일드 카드 유형은 좋지 않습니다. 정확한 유형 일치가 필요하며 이는 와일드 카드없이 얻을 수 있습니다.
반환 유형으로 와일드 카드 유형을 사용하지 마십시오. 사용자에게 추가적인 유연성을 제공하는 대신 클라이언트 코드에서 와일드 카드 유형을 사용해야합니다. 올바르게 사용되는 와일드 카드 유형은 클래스 사용자에게는 거의 보이지 않습니다. 그들은 받아 들여야 할 매개 변수를 받아들이도록하고 거부해야하는 매개 변수를 거부하도록합니다. 클래스의 사용자가 와일드 카드 유형을 고려해야하는 경우 클래스의 API에 문제가있을 수 있습니다.
참고 :
- 1. ArrayList를 (수집 <? extends E> C)
- 2. "? extends E"와 "T extends E"의 차이점은 무엇입니까?
- 3. 공용 인터페이스 ITMark <E extends comparable <E>>
- 4. Angelika Langer Enum <E extends Enum <E>> 디코딩
- 5. 제네릭 형식 <E extends Enum <E>>의 인스턴스에서 values ()를 호출 할 수 있습니까?
- 6. <extends Comparable>와 <extends Comparable < T >>의 차이점은 무엇입니까?
- 7. 스칼라의 제한된 제네릭 (Java에서 <E extends MyClass>)으로
- 8. List <?를 허용하는 메서드에 자식 목록을 전달할 수없는 이유는 무엇입니까? Parent>를 확장합니까?
- 9. <? extends > Java 구문
- 10. 목록 <? extends MyType>
- 11. "@Override"및 "<? extends Page>"의 의미는 무엇입니까?
- 12. 열거 Comparable가 구현 <E> 왜 안 대등 <Enum<E> 보통>
- 13. 이 제네릭 형식의 상한을 어떻게 추론합니까?</p> <pre><code>public interface ImportedEntity<T extends ImportedEntity<T, E>, E extends Enum<E>> </code></pre> <p>나는 <em>와 클래스가 해당 인터페이스의</em> UPPERBOUND 원하는 :
- 14. PriorityQueue <T extends Priorizable> 또는 <T extends Comparable>의 차이점
- 15. Swift에서 +++ 및 <<<는 무엇입니까?
- 16. 정적 인 <E>은 무엇입니까?
- 17. 사전 인터페이스에 대한 이진 검색 트리를 구현하는 방법은 무엇입니까?</p> 이제 <pre><code>public interface Dictionary<E extends Comparable<E>> extends Iterable<E> { </code></pre> <p>내가 이진 검색 트리를 사용하여이 인터페이스를 구현하도록 요청, 그러나 나는 꽤 혼란 스러워요부터 시작하는 방법을 모르는 해요 :
- 18. C++의 버전은 <? extends AnotherClass>
- 19. Generics Class <? extends Number> 설명
- 20. 반복자를 선언하는 <? 확장 E & Comparable <? super E>> 자바의 이터레이터
- 21. AbstractList <E> - add (int index, E element), add (E e) 등의 반환 유형의 차이점은 무엇입니까?
- 22. Collection <E> #toArray()가 E []를 반환하지 않는 이유는 무엇입니까?
- 23. Collection <? extends myObject>는 의미합니까?
- 24. 뷰에서 <% 및 <% =를 모두 사용하는 이유는 무엇입니까?
- 25. 리스트 <E> 구현
- 26. <E>은 컬렉션 <E>의 의미는 무엇입니까?
- 27. 은 <E는 열거을 확장 <E>>
- 28. 대표 목록 <E> as SortedMap <Integer,E> 자바로?
- 29. 목록 사용 방법 <? extends Maps <String, ?>>
- 30. Java generics : <B extends BaseB>와 <?가 일치하지 않습니다. extends BaseB>
'E'를 (를) 다시 사용할 수 있습니다. –
그들은 상호 배타적입니다. – SLaks
IMO 나는' (set, list, map 등)의 요소를 처리하기위한'static'유틸리티 메소드의 AClassOrInterface>'를 확장하고 싶습니다. 클래스/인터페이스 정의를 위해' '를 사용합니다. 필드 (E 유형의 필드 또는 E 유형의 요소로 채워진 콜렉션). –