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


95

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

<? extends Object>

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



3
@Dan 그 질문에서 "? extends Object"를 검색하면 아무것도 찾을 수 없습니다. 나는 무엇이든 추론 할 수 있는지 확인하기 위해 답변을 읽고 있지만 이것이 사실이라고 생각하지 않습니다. 특히 제네릭에 대해 말하는 것이 아닙니다.
orbfish 2011

@ 댄-다른 질문입니다. 나는 전에이 질문을 보았고 적어도 미묘한 차이에 대한 언급을 기억합니다. 내가 그것을 찾을 수 있는지 보자 ..
Paul Bellora

또한 찾으면 이것도 아닙니다 : stackoverflow.com/questions/678822/…
orbfish 2011

1
여기에 있습니다 : Java에서 Unbounded 와일드 카드의 중복 가능성 (Kevin Bourrillion의 오답 제공)
Paul Bellora

답변:


104

<?>그리고 <? 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
)

4
예제가 어떤 관련이 있는지 잘 모르겠습니다. (<?>도 <? extends Object>도 사용하지 않기 때문에)
orbfish 2011

27
@orbfish : extends Object실제로 의미있는 예이므로 흥미로울 것이라고 생각했다는 점에서만 관련 있습니다. 내가 착각했다면 사과한다. 적어도 귀하의 질문을 접하는 다른 사람들에게 관심이 있기를 바랍니다.
ruakh 2011

@ruakh-유형 매개 변수보다는 제한된 와일드 카드에 관심이 있었지만 최소한 대답하셨습니다.
orbfish 2011

1
당신은 그때 당신의 원래 포스트에서 그것을 언급 했어야했습니다. 그렇게하면 그의 대답이 당신과 더 관련이있을 수 있습니다.
liltitus27

19

<?>의 지름길로되어 있지만 <? 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 제네릭 및 컬렉션을 읽어보십시오.


컴파일러가 List <Object>로 변환하여 유형이 무엇인지에 대한 정보를 제공하는 경우 어떻게 List <?>를 수정할 수 있습니까? 분실?
Trismegistos

<?>이 레거시 API와 역 호환되도록 설계되었다고 생각합니다. <Object>와 <? Java 5 코드가 게시 된 Object>를 확장합니다.
Dennis C

9

<?><? 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 – 숫자
참조 :

여기에 이미지 설명 입력


"그래서 그것은 Object 클래스에서 상속되지 않는 Type을 받아 들일 수 있지만"모든 Java 클래스는 클래스로부터 상속되거나 암시 적으로 상속됩니다 Object.
hackjutsu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.