올바르게 이해하면 다음은 일반 유형입니다.
class Example<T> {}
다음은 구체적인 매개 변수화 된 유형입니다.
Example<String>
그리고 다음은 구체적인 매개 변수화 된 유형 이 아닙니다 .
Example<? extends Number>
다음을 감안할 때 누군가 Example이 구체적인 매개 변수 유형인지 여부를 설명 할 수 있습니까?
Example< OtherExample<? extends Number> >
Concrete가 아닌 경우 유형 인수 자체가 와일드 카드이거나 중첩 된 유형 인수가 와일드 카드이면 가장 바깥 쪽 유형이 Concrete가 아니라고 말하는 것이 사실 입니까?
최신 정보
이제 Concrete Parameterized Type이라는 용어가 공식적인 Java 용어가 아닐 수도 있다는 것을 알고 있습니다.
다음 소스에서 가져 왔습니다. http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#Topic2
결론
나는 다음과 같이 설득되었습니다.
Example< OtherExample<? extends Number> >
구체적인 매개 변수화 된 유형 (GenericsFAQ의 용어가 의도 한대로)은 와일드 카드 ( "?")를 직접 포함하지 않고 "new"키워드와 함께 사용할 수 있기 때문입니다.
감사!
여기 FAQ 안젤리카의 다른 곳에서는 다음과 같이 말합니다.
와일드 카드 매개 변수화 된 유형은 새 표현식에 나타날 수있는 구체적인 유형이 아닙니다.
그러나 이것을 확장하기 위해, 타입 인자로 제공 할 수있는 몇 가지 다른 종류의 타입이 있다고 말하고 싶습니다.
예제 클래스가 주어지면 :
class Example<T> {
T value;
}
new Example();
원시 유형은 유형의 "지우기"와 같습니다. T
바운드가 없기 때문에 원시 Example<T>
는 Example<Object>
. 차이점은 원시 유형으로 인해 제네릭 유형 시스템이 크게 무시된다는 것입니다. 실제로는 사용하지 마십시오. 이전 버전과의 호환성을위한 것입니다.
class HasExample<T> {
Example<T> myExample = new Example<T>();
HasExample(T value) {
myExample.value = value;
}
}
의 유형 Example
다음 유형은 공급 무엇이든지받습니다 HasExample
.
new Example<String>();
이것은 예제의 유형이 실제로 알려져 있음을 의미합니다.
원시 유형 및 제네릭과 함께 제네릭 클래스를 인스턴스화 할 수있는 세 가지 방법이 있습니다.
static void handle(Example<?> example) {
System.out.println(example.value);
}
하는 와일드 카드 나타냅니다 Example
일단이 있었다 구체적인 유형을하지만 우리는 그것이 무엇 확실하지 않다. 그것이 무엇인지 모르기 때문에 와일드 카드는 특정 방식으로 매개 변수화 된 멤버의 사용을 허용하지 않습니다. 위의 방법에서 우리는 여전히 그것을 인쇄 할 수 있습니다 ( toString
간접적으로 호출 ). 왜냐하면 그것이 Object
.
복잡한 선언이 구체적으로 간주되어야하는지 여부에 대해서는 예와 아니오 모두이지만 대부분 예라고 말하고 싶습니다. 다음과 같은 추가 클래스가 있다고 가정합니다.
class Holder<T> {
T held;
}
그러면 다음을 수행 할 수 있습니다.
Holder<Example<? extends Number>> holder =
new Holder<Example<? extends Number>>();
의 유형 인수 holder
는 다음 Example
과 같은 의미에서 구체적인 유형 : 입니다.
Holder
이 유형 으로의 새 인스턴스를 인스턴스화 할 수 있습니다 .각각의 유형 인수가 인스턴스로 수행 할 수있는 작업에 다른 영향을 미치기 때문에 유형 Holder
과 Example
개별적 으로 생각하는 것이 유용 할 것 Holder
입니다.
다음과 같은 작업을 수행 할 수 있습니다.
Example<Integer> example = new Example<Integer>();
example.value = Integer.valueOf(0);
// set holder.held
holder.held = example;
// get holder.held, but we lose some type information
Example<? extends Number> example = holder.held;
// access and use a member of the Example
Number number = example.value;
System.out.println(number.intValue());
그러나 우리는 이것을 할 수 없습니다 :
// set parameterized member of the Example
holder.held.value = Integer.valueOf(1);
이것이 와일드 카드의 효과이며 선언 된 유형 holder
이 "완전히 구체적이지 않음" 이라고 말할 수있는 이유 입니다. 그러나 이것은 중첩 된 개체에 대한 영향입니다. 와일드 카드는 Holder
인스턴스 를 사용할 수있는 방식을 직접 제한하지 않습니다 . Example
인스턴스 멤버를 사용할 수있는 방식 만 제한합니다 .
이러한 이유로 A<B<? extends C>>
(중첩 된 와일드 카드 포함)과 같은 유형 을 구체적 으로 생각하는 것이 합리적 이지만 몇 가지주의 사항이 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다