2

我在 putInstance 方法调用中收到以下编译错误“MutableClassToInstanceMap 类型中的方法 putInstance(Class, T) 不适用于参数 (Class, Number)”。有谁知道我做错了什么?谢谢!

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

2 回答 2

4

putInstance与常规方法相反,该方法的目的put是提供编译时类型安全。在这种情况下,您和我可以很容易地推断出它number必须是 给出的类型number.getClass(),但对于编译器来说,该信息是“丢失的”。也就是说,据所知,maybenumber是一个 Integer 并且number.getClass()是 Long.class;确定这是安全的还不够“聪明”。

解决方案:只需使用put()! 您仍然可以获得运行时检查,之后您仍然可以使用类型安全getInstance()方法,例如在Long l = this.identifiers.getInstance(Long.class);.

(最后提示:小心,因为Long.classlong.class都可以存在于 a 中ClassToInstanceMap并且可以映射到不同的值!)

于 2010-03-21T22:02:21.410 回答
0

凯文的回答很棒。此外,您可以从方法定义中看出编译器不会允许调用:

  • putInstance需要(在你的情况下) a Class<Number>
  • number.getClass()提供了一个Class<? extends Number>

这不是直接子类。一些方差和协方差的讨论在这里可能很有用。

于 2010-03-22T13:37:21.993 回答