今天在阅读的时候突然发现一个问题, 官方工具库里面的泛型容器有一部分方法并未使用泛型方法, 而是依旧沿用JDK1.5之前的Object, 例如:
-
Mapboolean containsKey(Object key); boolean containsValue(Object value); V get(Object key); V remove(Object key); boolean equals(Object o); ...List
boolean contains(Object o); boolean remove(Object o); boolean equals(Object o); ...- 原因
- 这些含
Object类型参数的方法都有一个共同特点, 即需要与容器内的Key或者Value进行比较, 而在Java的规范中, 比较是不需要类型完全相同的, 例如Number类型的实例可以和Long类型的实例相比较 - 在Java中比较方法需要重写
Object中的equals(Object o), 所以用到equals(Object o)的方法的参数自然用Object而不是泛型
- 这些含
- 你们以为这就完了吗?
- ...
- ...
- ...
- 反驳: 使用
Object可能造成的错误比原因1中的好处要大得多, 而且涉及到equals完全可以重新创建一个方法例如getByEquals(Object o)与get(K k)一起使用 - 个人结论: 可能存在设计缺陷(不要打我...)
- 佐证: 在比Java新的C#中,
Map(Dictonary)的get方法参数是(K k)







网友评论