【发布时间】:2009-09-21 15:32:33
【问题描述】:
在 Java 中,Map 接口定义为,
public interface Map<K,V> {
...
V get(Object key);
...
}
为什么不呢?
V get(K key);
我刚刚遇到了一个讨厌的错误,因为使用了错误的类型键。我认为泛型的目的是在编译期间及早捕获类型错误。这是否违背了这个目的?
【问题讨论】:
在 Java 中,Map 接口定义为,
public interface Map<K,V> {
...
V get(Object key);
...
}
为什么不呢?
V get(K key);
我刚刚遇到了一个讨厌的错误,因为使用了错误的类型键。我认为泛型的目的是在编译期间及早捕获类型错误。这是否违背了这个目的?
【问题讨论】:
Kevin Bourrillion blogged about this 不久前。总结:
Java 的方法 集合框架(和谷歌 收藏图书馆太)从不 限制其参数的类型 除非有必要防止 集合被破坏。
我个人不喜欢这种方法,但考虑到也采用了方差方法,它确实有些道理。
【讨论】:
一种类型的对象可以.equals() 指向另一种类型的对象。 get() 只要求你给它的对象是 .equals() 到你得到的键
【讨论】:
为了添加到@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)
.....
这可能会导致一些大错误!
【讨论】: