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)可能会出现的问题.会有什么害处?
这是一个可能有帮助的示例。请注意,如果以相同顺序传递具有相等元素的a,则equals
使用的方法ArrayList<T>
将返回 true 。LinkedList<T>
因此,如果您有 a List<ArrayList<Integer>>
,则可以有效地调用lastIndexOf
它并传递 a LinkedList<Integer>
,以便找到相等的ArrayList<Integer>
。但如果lastIndexOf
按照您描述的方式定义,这是不可能的。