2009-06-27 1 views
1

컴파일해야 할 코드가 있지만 실제로는 그렇지 않습니다. 여기 코드는 다음과 같습니다구체적인 EnumMap 개체 목록을 generic으로 전달 EnumMap 매개 변수 목록을 사용하면 컴파일 오류가 발생합니다.

public class Program { 
public void myMethod(List<EnumMap<? extends MyInterface, String>> map) 
{ 

} 

public void caller() 
{ 
    EnumMap<MyEnum, String> map = new EnumMap<MyEnum, String>(MyEnum.class); 

    List<EnumMap<MyEnum, String>> list = new LinkedList<EnumMap<MyEnum, String>>(); 

    myMethod(list); //error argument type is not compatible 

} 

}

MyEnum이하는 MyInterface를 구현하는 열거입니다.

myMethod (list)를 호출하면 인수 유형이 호환되지 않는 이유는 무엇입니까?

I가 MyMethod라는 서명을 변경하는 경우 :

public void myMethod(List<? extends Map<? extends MyInterface, String>> map) 

후 모든 것이 잘 작동하지만 난 여전히 의아해 해요 원래 방법 서명이 작동하지 않는 이유를 알고 싶습니다. 우리는 bs = as을 할당 할 수 있어야한다

enum MyEnum implements MyInterface { ...} 
... 
List<EnumMap<MyEnum, String>> as = new ArrayList<EnumMap<MyEnum, String>>(); 
List<EnumMap<? extends MyInterface, String>> bs; 

주어진

답변

1

EnumMap<MyEnum, String>EnumMap<? extends MyInterface, String>은 다른 유형입니다 (전자는 후자의 하위 유형 임). 그래서 List<EnumMap<MyEnum, String>>List<EnumMap<? extends MyInterface, String>>은 서로 호환되지 않습니다. 일반적으로 List<A>은 A와 B의 관계가 무엇이든 관계없이 A와 B가 다른 유형 인 경우 List<B>에 할당 될 수 없습니다 (A와 B의 관계가 무엇이든간에 (List뿐 아니라 모든 일반 유형에도 동일하게 적용됩니다). 바운드 형식 매개 변수가있을 때는 다른 이야기입니다. 호환성은 경계를 고려합니다.

2

그래서?

지금

enum OtherEnum implements MyInterface { XXX } 
... 
EnumMap<OtherEnum, String> otherMap = 
    new EnumMap<OtherEnum, String>(OtehrEnum.class); 
otherMap.put(OtherEnum.XXX, ""); 
bs.set(0, otherMap); 
EnumMap<MyEnum, String> myMap = as.get(0); 
MyEnum xxx = myMap.keys().iterator().next(); 

otherMap와 같은 객체에 myMap 점하지만 분명히 다른 유형을 가정합니다. 더 나쁜 것은 xxxMyEnum인데 유형이 OtherEnum 인 개체를 가리키고 있습니다.

다형성이있는 포인터 포인터는 어렵습니다.

+0

고마워요, 당신이 무슨 말을하는지 이해하지만 어떻게 공백 void myMethod (List > map) 메서드 서명을 변경하면 오류가 사라지게됩니까? 오류가 발생하지 않아야합니까? – Alvin

관련 문제