2010-03-21 5 views
2

putInstance 메서드 호출에서 "MutableClassToInstanceMap 유형의 putInstance (Class, T) 메서드가 인수 (Class, Number)에 적용 할 수 없습니다."라는 컴파일 오류가 발생합니다. 아무도 내가 뭘 잘못하고 있는지 알아? 감사! 일반 put에 반대Generics에서 MutableClassToInstanceMap을 사용하여 컴파일 오류를 발생했습니다.

public class TestMutableClassToInstanceMap { 

    public final MutableClassToInstanceMap<Number> identifiers = MutableClassToInstanceMap.create(); 

    public static void main(String[] args) { 
     ArrayList<Number> numbers = new ArrayList<Number>(); 
     numbers.add(new Integer(5)); 
     TestMutableClassToInstanceMap test = new TestMutableClassToInstanceMap(numbers); 
    } 

    public TestMutableClassToInstanceMap(Collection<Number> numbers){ 
     for (Number number : numbers) { 
      this.identifiers.putInstance(number.getClass(), number); //error here 
     } 
     this.identifiers.putInstance(Double.class, 5.0); // This works 
    } 

} 

답변

4

putInstance 방법의 목적은, 컴파일시 유형의 안전을 제공하는 것입니다. 이 경우 numbernumber.getClass()에 의해 제공되는 유형이어야하지만 컴파일러에는 해당 정보가 "손실됩니다"라고 쉽게 추론 할 수 있습니다. 즉, 까지는을 알고 있습니다. 어쩌면 number은 정수이고 number.getClass()은 Long.class입니다. 이것이 안전하다는 것을 이해하기에 "똑똑한"것이 아닙니다.

해결책 : 그냥 put()을 사용하십시오! 당신은 여전히 ​​런타임 검사를 받고, 그 후에도 과 같이 typesafe getInstance() 메서드를 사용할 수 있습니다.

(최종 팁! Long.classlong.class 모두가 ClassToInstanceMap에 존재할 수 있으며 다른 값으로 매핑 할 수 있기 때문에,주의는)

0

케빈의 대답은 아주 좋습니다. 게다가, 당신은 컴파일러가 호출을 허용하지 않을 방법 정의에서 알 수 있습니다 :

  • putInstance는 (귀하의 경우)를 Class<Number>이 필요합니다.
  • number.getClass()은 직접 서브 클래스가 아닌 Class<? extends Number>

을 제공합니다. 여기서 약간의 분산 및 공분산 대화가 유용 할 수 있습니다.

관련 문제