2013-08-22 1 views
13

<? extends Object><E extends Object>의 차이점은 무엇입니까? 언제 다른 것을 사용해야합니까?<무엇입니까? Object> 및 <E extends Object>를 확장합니까?

+7

'E'를 (를) 다시 사용할 수 있습니다. –

+0

그들은 상호 배타적입니다. – SLaks

+0

IMO 나는''를 확장하고 싶습니다. 클래스/인터페이스 정의를 위해' '를 사용합니다. 필드 (E 유형의 필드 또는 E 유형의 요소로 채워진 콜렉션). –

답변

4

<? extends Object>EObject를 확장하는 파라미터 화 된 형태)을 요구한다 (<E extends Object> 반면, 경계 타입, Object을 연장 경계 와일드 (미지이다.

대부분의 미묘한 차이가 파라미터 상부에서 와일드 카드을 경계 범위 :

  • 일반 형식 클래스를 만들 때 바인드 된 와일드 카드를 사용할 수 없으며 형식화 된 매개 변수 만 만들 수 있습니다. 허용됩니다.

  • 바운드 와일드 카드는 알 수없는 형식이므로 컬렉션에 항목을 추가해야하는 곳에서 사용할 수 없으며 컬렉션에서받는 형식을 알 수 없으므로 형식 안전하지 않습니다 .

  • 바인딩 된 와일드 카드는 여러 제네릭 형식 (경계)에 바인딩 할 수 없습니다.

이 정보가 도움이되기를 바랍니다.

+0

둘 다''와''가 묶여 있고, 객체의 상한이 있습니다. – Katona

+0

사실, 저는 2와 2의 차이를 만들기 위해 편집을했습니다 ... –

+0

실제로 아이템을 추가해야하는 곳에서 와일드 카드를 사용합니다 와일드 카드가

3

나중에 유형을 참조해야하는 경우 E을 사용하십시오. 다시 유형을 참조 할 필요가없는 경우 ?을 사용하십시오.

-1

<E>은 형식 인수를 선언합니다.
제네릭 형식 또는 메서드를 만들 때만 사용할 수 있습니다.

<? ...>은 와일드 카드로 형식 인수가 입니다.
닫힌 제네릭 형식을 만들 때만 사용할 수 있습니다.

0

일반 코드에서 와일드 카드라고하는 물음표 (?)는 알 수없는 형식을 나타냅니다. 와일드 카드는 매개 변수, 필드 또는 로컬 변수의 유형과 같은 다양한 상황에서 사용할 수 있습니다. 때로는 반환 유형으로 사용합니다 (더 구체적으로 프로그래밍하는 것이 더 좋습니다). 와일드 카드는 일반 메소드 호출, 일반 클래스 인스턴스 작성 또는 수퍼 유형에 대한 유형 인수로 절대로 사용되지 않습니다. 추가 정보를 원하시면 여기를 this

15

을 확인 즉시 내 마음에 오는 약간의 차이가 있습니다

  • 유형 매개 변수의 경계가 여러 범위를 지정할 수 있습니다 - 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에 문제가있을 수 있습니다.


참고 :

관련 문제