声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型( generic)类或者接口。
泛型类和泛型接口统称为泛型( generic type)。
每种泛型都可以定义一组参数化的类型(parameterized type)
构成格式:类(接口)名<参数类型>。
每种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。
如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。
出错之后应该尽快发现,最好是在编译时就发现。
1、使用泛型后,就可以很快的发现错误。
2、使用泛型后,删除元素就不需要进行手工转换了。如下代码:
public void test(){
MyList<MyItem> myItemMyList=new MyList<MyItem>();
myItemMyList.add(new MyItem1("123"));//error
}
public class MyList<E> {
private E e;
public MyList () {
}
public void add(E e){
this.e=e;
}
public E getMyList(){
return e;
}
}
public class MyItem1 {
private String name;
public MyItem1(String name) {
this.name=name;
}
}
public class MyItem {
private String name;
public MyItem (String name) {
this.name=name;
}
}
如果不提供参数类型,使用集合类型和其他泛型也仍然是合法的,但不应该这么做。如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。
原生态类型List和参数化类型List<Object>之间有什么区别?
前者逃避了泛型检查,后者则明确告知编译器,它能够持有任意类型的对象。
你可以将List<String>传递给类型List的参数 却不能传递给类型List<Object>的参数。因为,泛型有子类型化的规则,List<String>是原生态类型List的一个子类型,而不是参数化类型List<Object>的子类型(见第25条)。
如果使用像List这样的原生类型,就会失掉类型安全性,但是如果使用像List<Object>这样的参数化类型,则不会。
网友评论