[java] <?>와 <의 차이점은 무엇입니까? Java Generics에서 Object>를 확장합니까?

이전에 어떤 객체를 의미하기 위해 사용 된 와일드 카드를 보았지만 최근에는 다음을 사용했습니다.

<? extends Object>

모든 객체가 Object를 확장하므로이 두 가지 사용법이 동의어입니까?



답변

<?>그리고 <? extends Object>예상대로, 동의어입니다.

제네릭 extends Object이 실제로 중복되지 않는 몇 가지 경우가 있습니다. 예를 들어, <T extends Object & Foo>발생할 TObject가진 반면, 소거 아래 <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 – 숫자
참조 :

여기에 이미지 설명 입력


답변