2013-12-13 4 views
3

미안합니다. "Java 일반 메서드는 적용 할 수 없습니다."질문. 내가 내 이해 잃었는지 알고 싶습니다일반 메서드가 인수에 적용되지 않습니다.

  1. List<E>Collection<E>
    의 하위 유형입니다 -> 의미, List<String>Collection<String>

  2. 한다고 가정의 하위 유형 인 B, List<A> 확장 > 그러나이 경우, T (또는 String), 그래서이 표시되지 않는 한 종류가 얼마나 대체 공주 역 - 하지List<B>
    의 하위 유형입니다 립이 내 문제를 설명해 줄 수 있니?

문제 코드 :

private <T, K> void genericAddToMapOfLists(HashMap<K, Collection<T>> mapOfLists, 
    K key, T value) { 
    if (mapOfLists.containsKey(key)) { 
     mapOfLists.get(key).add(value); 
    } else { 
     List<T> newList = new ArrayList<T>(); 
     newList.add(value); 
     mapOfLists.put(key, newList); 
    } 
} 

private void parseToFruitList(HashMap<String, List<String>> fruit_colors, 
     String fruitName) { 
    String color = ""; 
    genericAddToMapOfLists(fruit_colors, fruitName, color); 
} 

오류 : 나는이 genericAddToMapOfLists(HashMap<K,List<T>>, K, T)에 메서드 서명을 변경할 때

The method genericAddToMapOfLists(HashMap<K,Collection<T>>, K, T) in the type MyGroceryStore is not applicable for the arguments (HashMap<String,List<String>>, String, String) 

코드는 작동합니다.

+0

제목에 주요 태그를 추가 할 필요가 없습니다. –

답변

2

(I가 와일드 카드로 ?을 사용하지 않는, 우리는 단지 지금 그것에 대해 걱정하지 않는다) 서브 유형은 Collection<String> "입니다. AB 인 경우 List<A>이 아니며 하위 유형은 List<B>입니다.

이 단계를 더 진행하면 HashMap<String, List<String>>HashMap<String, Collection<String>>이 아닙니다.

AList이고 BCollection 인 동일한 추론이 적용됩니다. HashMap<String, List<String>>HashMap<String, Collection<String>>했다 경우에, 당신은 VectorList없는 경우에도 불구하고 HashMap<String, Collection<String>>에 할당하여 HashMap<String, List<String>>Vector<String>put 수 있고, 그래서는 허용하지 않는다.

6

이것은 정확히 두 번째 지점에서 설명하는 문제입니다.

한다고 가정 AList<A>이 방법은

HashMap<?, Collection<?>> 

을 기대하지만 당신은 그것을

HashMap<?, List<?>> 

012을주고있다이 경우 List<B>

의 하위 유형 아니라, B 확장가 Collection를 확장하지만, HashMap<?, List>HashMap<?, Collection>

의 하위 유형 아니다 당신이 바로 그 "List<String>에있어

관련 문제