代码之家  ›  专栏  ›  技术社区  ›  ZZ Coder

Java泛型:为什么MAP.GET()忽略类型?[复制品]

  •  9
  • ZZ Coder  · 技术社区  · 15 年前

    在Java中,映射接口定义为

    public interface Map<K,V> {
        ...
        V get(Object key);
        ...
    }
    

    为什么不呢?

    V get(K key);
    

    我刚碰到一个讨厌的虫子,因为用错了类型的钥匙。我认为泛型的目的是在编译的早期捕获类型错误。这是否违背了这个目标?

    3 回复  |  直到 15 年前
        1
  •  9
  •   Jon Skeet    15 年前

    凯文·布尔里利翁 blogged about this 不久前。总结:

    JAVA语言的统一方法 集合框架(以及谷歌 收藏库也)从不 限制参数的类型 除非有必要阻止 从破碎中收集。

    我个人并不喜欢这种方法,但是考虑到方差方法,它确实有一些意义,因为方差方法也被采用了。

        2
  •  3
  •   newacct    15 年前

    一种类型的对象可以是 .equals() 其他类型的对象。 get() 只要求你给它的对象是 等式() 你得到的钥匙

        3
  •  -3
  •   WolfmanDragon    15 年前

    为了添加到@子元素,Java被设计成Java总是向后兼容的。泛型不允许使用错误类型的puts,因为这不会破坏向后兼容性。确保使用正确的钥匙的简单方法是这样做。

    K key = null;
    V value = null;
    
    Map<K,V>  mapped = new HashMap<K,V>()
    .......//set the key and value..........
    mapped.put(key, value)
    .....
    V var = mapped.get(key);
    

    问题解决了。
    对于泛型还有一个警告,类的任何子级也可以放入集合中。

    Number k= null;
    Number v= null;
    
    Map<Number,Number>  mapped = new HashMap<Number,Number>()
    .......//set the key and value..........
    k = double someDouble;
    v = int someInt;
    mapped.put(k, v)
    .....
    

    这可能会引起一些大虫子!!