다음과 같은 수업이 있습니다.
public class Foo<T>
{
//What ever inside
}
그리고 나중에 다음과 같이하고 싶습니다.
public class MyClass
{
Foo foo;
public MyClass(int x)
{
if(x==1)
{
foo = new Foo<Integer>();
//EDIT1
handleFooWhenItIsInteger();
//EDIT1
}
else
{
foo = new Foo<String>();
//EDIT1
handleFooWhenItIsString();
//EDIT1
}
}
'handleFooWhenItIsInteger ()'함수에서 정수 작업을 수행하고 다른 문자열에서는 일부 정수 작업을 수행한다고 가정합니다.
위와 같이 'foo'를 정의해도 괜찮습니까?
그러나 이것은 다음 과 같은 원시 유형 의 사용을 컴파일합니다.
Foo foo;
귀하의 일반 유형에 Foo<T>
대해서는 권장되지 않습니다. 원시 유형은 레거시 이유, 즉 제네릭이 도입 된 Java 5 이전에 작성된 코드와의 호환성을 위해서만 지원됩니다.
설명하기 위해 어떤 일반적인 푸 오히려 작성해야 Foo<?>
인스턴스에 대해 설명 Foo
어떤 일반적인 유형입니다. 그런 다음 컴파일러는 코드에서 나중에 이러한 인스턴스에 대해 형식이 아닌 안전한 메서드를 호출하지 않았는지 확인합니다. 예를 들어 인스턴스는 a Foo<Integer>
또는 Foo<String>
. 와일드 카드 유형 사용 덕분에 Foo<?>
동일한 변수를 사용하여 둘 다 참조 할 수 있지만 참조 된 인스턴스의 실제 제네릭 유형을 더 이상 가정 할 수 없습니다.
기술적으로 Foo
또는 을 사용하는 것에는 큰 차이가 없습니다 Foo<?>
. 그러나 전자를 사용하면 컴파일러는 원시 유형 사용에 대한 경고를 생성합니다. 컴파일러는 제네릭 형식 인수를 추가하는 것을 잊지 않고 실수로 원시 형식 만 사용했는지 확인할 수 없습니다. 이것이 <?>
와일드 카드 참조가 필요한 경우 항상 추가 하는 데 몇 개의 문자를 사용해야하는 이유 입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다