【问题标题】:Java Generics: Why Does Map.get() Ignore Type? [duplicate]Java 泛型:为什么 Map.get() 忽略类型? [复制]
【发布时间】:2009-09-21 15:32:33
【问题描述】:

在 Java 中,Map 接口定义为,

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

为什么不呢?

V get(K key);

我刚刚遇到了一个讨厌的错误,因为使用了错误的类型键。我认为泛型的目的是在编译期间及早捕获类型错误。这是否违背了这个目的?

【问题讨论】:

标签: java generics


【解决方案1】:

Kevin Bourrillion blogged about this 不久前。总结:

Java 的方法 集合框架(和谷歌 收藏图书馆太)从不 限制其参数的类型 除非有必要防止 集合被破坏。

我个人不喜欢这种方法,但考虑到也采用了方差方法,它确实有些道理。

【讨论】:

    【解决方案2】:

    一种类型的对象可以.equals() 指向另一种类型的对象。 get() 只要求你给它的对象是 .equals() 到你得到的键

    【讨论】:

    • 这不是真的。我得到 ClassCastException 所以类型必须匹配。
    • 如果你得到一个 ClassCastException 那么 equals() 的实现很差。如果类型不兼容,最好返回 false。
    【解决方案3】:

    为了添加到@subtenante,Java 的设计使 Java 始终向后兼容。泛型不允许放置错误类型,因为这不会破坏向后兼容性。确保使用正确密钥的简单方法是执行此操作。

    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)
    .....
    

    这可能会导致一些大错误!

    【讨论】:

    • 我真的不明白擦除是从哪里来的。仅当您在做“不安全”的事情时,擦除才是一个问题。
    • Put() 使用泛型类型。我只是在抱怨 get。
    • @ZZ Coder,我解决了顶层代码中的 get,第二组代码我指出了另一个常见问题,一些人使用泛型
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多