2016-08-16 5 views
-1

왜 Java가 제공했는지 일반 유형을 사용하여 문제를 해결할 수있는 경우 무제한의 와일드 카드가 제공됩니다. 예를Unbounded 와일드 카드 사용과 Java의 Generic 유형의 차이점은 무엇입니까?

class UnBoundedUsage { 

    //Method 1 
    public static void unboundedMethod(List<?> list) { 
     for(Object obj : list) { 
      System.out.println(obj); 
     } 
    } 

    //Method 2 
    public static <T> void methodWithType(List<T> list) { 
     for(T obj : list) { 
      System.out.println(obj); 
     } 
    } 
} 

를 들어 은 누구도 날 우리가 방법 1을 가질 필요가 왜 2 다음 우리의 요구 사항을 해결할 수 방법 경우 이해하는 데 도움이 바랍니다 수 있습니다. 무제한 와일드 카드를 사용하여 문제를 해결할 수 있고 일반 메서드 유형 (예 : 방법 2)을 사용하여 해결할 수없는 문제를 의미합니까?

+2

방법 2에서 '목록'에 요소를 추가 할 수 있습니다. 방법 1에서 할 수 없습니다. –

+0

@AndyTurner에게 감사드립니다.하지만 요소를 추가하는 것이 유일한 문제 인 경우 코드 스 니펫 아래로 변경할 수 있습니다. public static void methodWithType (List list) { for (Object obj : list) { System.out.println (obj); } } – MishraJi

+0

유일한 문제는 아닙니다. 이것은 컴파일러가 안전성을 보장 할 수 있도록 충분한 정보를 제공하는 변수의 유형에 불과합니다. –

답변

1

차이점은 방법 1에서 목록 요소의 유형에 대해 알지 못한다는 것입니다. 목록 요소를 사용하여 수행 할 수있는 작업은 모두 Object과 같이 처리하는 것입니다.

Object obj = list.get(0); 
이 목록의 일반적인 유형 Object 것을 보장하지 않기 때문에 당신은 심지어 목록에 다시이 요소를 추가 할 수 없습니다

:

List<Integer> list = new ArrayList<>(Arrays.asList(1)); 
method1(list); 

void method1(List<?> list) { 
    Object obj = list.get(0); 
    list.add(obj); // Compiler error! Can't add an Object to the List. 
} 

는하지만이 유형을 사용하는 경우이 작업을 수행 할 수 있습니다 변수는 컴파일러가 목록에서 가져 오는 요소에 대한 정보를 가지고 있기 때문에; 그리고 다시 요소를 추가 안전하다는 것을 알고 이것을 사용할 수 있습니다 :

List<Integer> list = new ArrayList<>(Arrays.asList(1)); 
method2(list); 

<T> void method2(List<T> list) { 
    T obj = list.get(0); 
    list.add(obj); // OK! 

    // But, if you discard the type information... 
    Object obj1 = list.get(0); 
    list.add(obj1); // Still a compiler error. 
} 

T의 삭제 된 유형은 여전히 ​​Object이다; 그러나 컴파일러가 T에 대한 참조를 보게되면 컴파일러는 목록 요소의 경계와 호환된다는 것을 알 수 있습니다.