为什么List.remove会以它的方式重载?

ful*_*ton 9 java api collections list

有两个暧昧的历史原因List.remove吗?

对我来说,这似乎是一个糟糕的设计.
对于List<Integer>它来说,这似乎真的令人困惑.

编辑:

每个人看起来都很好.让我精确一点.

比方说我有一个List<Boolean>.

Integer idx = Integer.valueOf(2);
list.remove(idx)
Run Code Online (Sandbox Code Playgroud)

虽然idx是一个对象,但Java会编译并删除索引2处的项目.

现在,如果它是a List<Integer>,那么相同的代码将调用具有完全不同行为的不同方法.

我们不要谈论泛型会发生什么.

我觉得不同的行为意味着不同的名字是一个宝贵的规则,尤其是在同一个班级内.

Joa*_*uer 12

首先:

我不确定这是否已经知道,但为了完整起见,我想我会提到它.

需要注意的一个重要部分是API在泛型(更重要的是)自动装箱之前就已经过了很多(Java 1.5中引入了集合API,Java 5中引入了自动装箱).

因此,当他们第一次设计API时,绝对没有办法混淆这两者.即使你List包含的Integer对象,也很简单:如果用原始参数type(int)调用方法,那么它就是索引,如果你传入一个Object(即使它是Integer),那么你传入要移除的对象.

当然,它仍然不是最好的想法(但是相当多的Java API ......不完美),但当时混淆的可能性要低得多.

混乱的几率就越大,因为只有在存在int/ Integer屏障变得不那么明显的感谢自动装箱和自动拆箱.

旁注:集合API的一个重要"特性"是"常用方法的简称".以前的"解决方案" Vector/ Enumeration曾进行很常见的操作出了名的长名字:

  • Vector.elementAt()List.get()
  • Vector.addElement()Collection.add()
  • Enumeration.hasMoreElements()/ nextElement()vs. Iterator.hasNext()/next()
  • Vector.removeElement()Collection.remove()
  • Vector.removeElementAt()List.remove(int)

最后一个是他们可能走得太远的地方.