2013-07-17 3 views
-2

, 왜이 유효하지 않습니다 자바 제네릭 와일드 카드 항목

List<?> l = new ArrayList()<?>; 

이 유효한지 고려 :

public interface someList<?>{} 

모두 억제 할 와일드 카드가 있습니다.

List l = new ArrayList(); 

public interface someList {} 

가 어디 잘못 갈거야 : 내 마음에서 그들은 모두 동등?

+0

목록 l = new ArrayList (); – monkjack

+0

기본적으로 '?' 와일드 카드, 이것은 틀린가? – Victor

+0

글쎄, 타입리스트를 주겠다.하지만 그 타입이 무엇인지 상관하지 않는다. 어떤 타입을 받아 들일 수있는리스트를 원한다면 List monkjack

답변

2

List<?>하나는 유형을 의미합니다. 프로그래머가 typechecking의 이점을 누리기 위해 디자이너는 인스턴스화 중에 유형을 제공해야한다고 결론 내렸다.

완전한 유연성을 원한다면 List<?> l = new ArrayList<Object>()이 최선의 방법입니다.

와일드 카드 ?은 제네릭을 원하지만 어떤 유형이든 상관하지 않는다고 말하는 수단 일뿐입니다. generic-less 변형과 달리 필요한 경우 유형 확인 및 컴파일러 경고를받습니다.

+0

'목록 리터 "당신은 완전한 유연성을 원한다면"= 새로운 ArrayList를 ()', 말,보다 더 "유연한"아니다'목록 리터 = 새로운 ArrayList를 ()' – newacct

+0

"일반없는 변형과 달리 , .... "(더 중요하게) generic-less 변종과는 달리,'null'을 제외하고는 목록에 아무것도 추가 할 수 없기 때문에 완전히 쓸모가 없습니다. – newacct

+0

사실, 그리고 다소 불행한 말투가 내 부분을 지적 해 주셔서 고맙습니다! –

0

당신은 말도 안되는 제네릭 형식의 개체를 만들려고하기 때문에. 오브젝트가 작성된 경우, Java는 양자 월드 모델이 아니기 때문에 오브젝트가 동시에 많은 유형이 아닐 수도 있습니다. 와일드 카드 유형은 유형 매개 변수가 사전에 알려지지 않았 음을 나타내지 만 값을 가질 때 특정 유형이됩니다.

그리고 이것은 후자가 정적 유형 Object의 값만 허용하기 때문에 generics를 사용하여 유형을 임의의 참조 유형으로 제한 할 수 있기 때문에 List l = new ArrayList();과 동일하지 않습니다. 당신이 ArrayList 알 수없는 의 유형을 인스턴스화 할 수 없습니다, 때문에

2

을 (비록이 정보는 컴파일시에 존재).

ArrayList 유형을 인스턴스화 할 수 있습니다.

new ArrayList(); 

또는 당신이 ArrayList 객체 의 인스턴스를하거나 일부 특정 유형을 알려져 있습니다. 정말

class CrazyBogusUnrelatedType { } 

List<?> l = new ArrayList<CrazyBogusUnrelatedType>(); 

:

new ArrayList<Object>(); 
new ArrayList<String>(); 
1

그냥 이렇게. 이것은 100 % 정확하고 100 % 유형 안전합니다. 이것은 당신이 거기에 임의의 것을 사용할 수 있다는 것을 보여줍니다. 또한이 작업의 부조리를 보여줍니다. 심지어 원격으로 가까이

하지 : 내 마음에

그들은 모두 동일합니다. 그것들은 완전히 반대입니다.

List l으로 아무 것도 추가 할 수 있습니다. List<?> l의 경우 null을 제외하고 아무 것도 추가 할 수 없습니다. 기본적으로 List<?> l = new ArrayList()<?>;으로 초기화하는 목록은 비어 있기 때문에 거의 쓸모가 없습니다. null 만 추가 할 수 있기 때문에 여기에 포함될 수있는 것은 null 개입니다.

와일드 카드를 사용하면 생깁니다. PECS (생산자 extends, 소비자 super) 규칙을 상기하십시오. 여기에 extends 와일드 카드가 있습니다 (대부분의 경우 바운더리 와이드 카드는 extends Object과 동일 함). 이는 제작자 로서만 유용합니다. 생산할 것이 없다는 것을 제외하고 - 그것은 비어 있습니다. 그럼 왜 이걸 원할거야?