为何泛型容器中的方法参数保留Object

今天在阅读的时候突然发现一个问题, 官方工具库里面的泛型容器有一部分方法并未使用泛型方法, 而是依旧沿用JDK1.5之前的Object, 例如:

  • Map
      boolean 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);
    
      ...
    
    • 原因
      1. 这些含Object类型参数的方法都有一个共同特点, 即需要与容器内的Key或者Value进行比较, 而在Java的规范中, 比较是不需要类型完全相同的, 例如Number类型的实例可以和Long类型的实例相比较
      2. 在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)

你可能感兴趣的:(为何泛型容器中的方法参数保留Object)