이전에 어떤 객체를 의미하기 위해 사용 된 와일드 카드를 보았지만 최근에는 다음을 사용했습니다.
<? extends Object>
모든 객체가 Object를 확장하므로이 두 가지 사용법이 동의어입니까?
답변
<?>
그리고 <? extends Object>
예상대로, 동의어입니다.
제네릭 extends Object
이 실제로 중복되지 않는 몇 가지 경우가 있습니다. 예를 들어, <T extends Object & Foo>
발생할 T
될 Object
가진 반면, 소거 아래 <T extends Foo>
가 될 것이다 Foo
소거하에. (이는를 사용한 pre-generics API와의 호환성을 유지하려는 경우 중요 할 수 있습니다 Object
.)
출처 : http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; JDK의 java.util.Collections
클래스에 다음 서명이있는 메서드가있는 이유를 설명합니다 .
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
답변
<?>
의 지름길로되어 있지만 <? extend object>
둘 사이에는 약간의 차이가 있습니다.
<?>
수정 가능하지만 <? extend object>
그렇지 않습니다. 그들이 이렇게 한 이유는 수정 가능한 유형을 쉽게 구별 할 수 있도록하기 위함입니다. 외모가 같은 것을 것을 <? extends something>
, <T>
, <Integer>
nonreifiable 있습니다.
예를 들어이 코드는
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
그러나 이것은 오류를 제공합니다
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
자세한 정보는 Maurice Naftalin의 Java 제네릭 및 컬렉션을 읽어보십시오.
답변
<?>
는 <? extends Object>
. 자세한 내용은 아래 공유 링크를 읽을 수 있습니다.
<?>
"?"
알 수없는 유형을 나타내며 코드에서 모든 유형을 나타낼 수 있습니다. 유형에 대해 잘 모르는 경우이 와일드 카드를 사용하십시오.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
참고 : 모든 <?>
것을 의미합니다. 따라서 Object
클래스 에서 상속되지 않는 Type도 받아 들일 수 있습니다 .
<? extends Object>
<? extends Object>
클래스를 확장하는 Object 또는 하위 클래스를 전달할 수 있음을 의미합니다 Object
.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T – 유형
E를 나타내는 데 사용 – 요소
K 를 나타내는 데 사용 – 키
V – 값
N – 숫자
참조 :