为什么List接口的lastIndexOf()方法接受Object作为参数而不是E?

whi*_*hat 7 java generics list

List接口的lastIndexOf()方法接受Object类型的参数.

但是,add()方法接受E类型的参数(这是在创建List时定义的List的泛型类型)因为add()只接受E,所以这会阻止开发人员(或用户)在编译时自己将任何不兼容的对象添加到列表中.

现在,Java doc说如果传递的对象不兼容,lastIndexOf()可以抛出ClassCastException.但是,当我在Eclipse Helios中运行以下代码时,我没有得到任何异常: -

package scjp.collection.list;

import java.util.ArrayList;
import java.util.List;

public class LastIndexOf {
public static void main(String[] args) {
    List<String> list = new ArrayList<String>();

    list.add("some");
    list.add("thing");
    list.add("at");
    list.add("last");
    list.add("and");
    list.add("at");
    list.add("again");



    System.out.println(list.lastIndexOf("at"));
    System.out.println(list.lastIndexOf(10));                    // # 1
    System.out.println(list.lastIndexOf(new LastIndexOf()));     // # 2
}
}
Run Code Online (Sandbox Code Playgroud)

在第1行和第2行,我已将不兼容的对象传递给我的List类型为String的对象.但是,我得到的输出是: -

5
-1
-1
Run Code Online (Sandbox Code Playgroud)

我没有得到ClassCastException.

如果lastIndexOf()方法接受了E类型的对象而不是Object类型的对象,那么这只能在编译时被阻止.为什么不这样做?

Java创建者必须考虑到如果它接受E(而不是Object)可能会出现的问题.会有什么害处?

Daw*_*ica 1

这是一个可能有帮助的示例。请注意,如果以相同顺序传递具有相等元素的a,则equals使用的方法ArrayList<T>将返回 true 。LinkedList<T>因此,如果您有 a List<ArrayList<Integer>>,则可以有效地调用lastIndexOf它并传递 a LinkedList<Integer>,以便找到相等的ArrayList<Integer>。但如果lastIndexOf按照您描述的方式定义,这是不可能的。