2012-03-23 2 views
0

을 확장? 유형 Organic<capture#1-of ? extends Elem>에서제네릭에서

방법 react(capture#1-of ? extends Elem)http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

목록에서 인수 (Elem)

+0

가 왜 변수 선언과 객체 인스턴스화 다른 매개 변수를 사용하는 도움이되기를 바랍니다 무엇인가? 무엇을 성취하려고합니까? – biziclop

+0

나는 아무것도 얻고 싶지 않습니다. 그것은 책에서 나온 운동 일뿐입니다. –

답변

1

적용되지 않습니다 바운드 와일드 카드의 예입니다. ? 는 이전에 본 와일드 카드와 마찬가지로 알려지지 않은 유형을 나타냅니다. 그러나이 경우 알 수없는 유형은 실제로 Shape의 부속 유형이라는 것을 알고 있습니다. (주 : Shape 그 자체 또는 일부의 서브 클래스 일 수도 있습니다 만, 문자 그대로 Shape를 확장 할 필요는 없습니다.) Shape는 와일드 카드의 상한이라고합니다.

와일드 카드를 사용할 때 융통성있게 지불해야하는 가격이 있습니다. 이 가격은 현재 방법의 본문에 모양을 쓰는 것이 불법이라는 것입니다. 예를 들어 허용되지 않는 이유는 다음과 같습니다.

public void addRectangle(List<? extends Shape> shapes) { 
    // Compile-time error! 
    shapes.add(0, new Rectangle()); 
} 

위의 코드가 허용되지 않는 이유를 알아낼 수 있어야합니다. shapes.add()에 대한 두 번째 매개 변수의 유형은? Shape - 알 수없는 Shape의 하위 유형. 우리는 그것이 어떤 타입인지 알지 못하기 때문에 그것이 Rectangle의 상위 타입인지는 알 수 없다. 그것은 그러한 슈퍼 타입 일 수도 있고 그렇지 않을 수도 있기 때문에 거기에 사각형을 전달하는 것은 안전하지 않습니다. 당신이 수퍼 클래스 객체를 전달 호출 할 수 없습니다로 컴파일 에러가 발생합니다 반응 - 그리고

구체적 솔루션에 대해 얘기, 당신은 당신이 법적으로 compound = new Organic<ElemSubClass>()을 할당 할 수 있습니다 Organic<? extends Elem> 유형으로, Elem 형식의 개체와 반응하여 호출 할 수 없습니다.

0

가 작동합니다 아래 당 방법 reactas 수정 :

void react(Elem e) { 

} 
0

'? extends SomeClass '는 사용자가 SomeClass 또는 하위 클래스를 일반 매개 변수로 전달할 수있게하려는 경우 제네릭 형식을 정의하는 데 사용됩니다. 즉, Organic을 Elem의 서브 클래스로 매개 변수화하려는 경우

public class Organic<E extends Elem> { 
    void react(E e) { 
} 

을 입력하면됩니다. 주요 방법 당신은 같은 것을 할 수 있습니다

Organic<Elem> compound = new Organic<ElemOrAnyElemSubclass>(); 

을 나는 방법 본문에

Organic<? extends Elem> 

를 사용할 필요가 없습니다 알다시피.

전체 코드 :

public class Organic<E extends Elem> { 
void react(E e) { 
} 

static void main(String[] args) { 
    Organic<Elem> compound = new Organic<Elem>(); 
    compound.react(new Elem()); 
    } 
} 
class Elem {} 
class ElemSubClass extends Elem {} // if you need 

은 또한 당신이 표현의 왼쪽과 오른쪽에 같은 일반적인 유형을 사용해야합니다. 이것은 불법입니다 : 유기 화합물 = 새로운 유기();

확실하지 당신이 원하는 있지만

관련 문제