泛型是参数化的一种类型,只在编译时起作用,类似于在某个容器上贴一个标签。
例如我们常见的List<T> ,Set<E> ,Map<K,V> 其中E,K,V都是泛型。
泛型的作用:官方解释首先:泛型是java1.5提供的新特性;主要是为了解决数据类型的安全性问题,是在类声明的时候通过一个标示表示类中某个属性的类型或者是某个方法的返回值以及参数类型。这样在类声明或者实例化的时候只要指定好需要的类型即可。
泛型的应用通常分三种:
一,类泛型:
上面的List<E> 就是,通常是在实例化对象时,确定泛型的类型,一旦确定就会受限制。
public class GenericClass {
static class MyList<T>{
ArrayList<Object> list;
private void add(T t){
if(list==null){
list=new ArrayList<Object>();
}
list.add(t);
}
}
public static void main(String[] args) {
MyList listStr=new MyList();
listStr.add(2);
}
}
这段代码不会报错,
public class GenericClass {
static class MyList<T>{
ArrayList<Object> list;
private void add(T t){
if(list==null){
list=new ArrayList<Object>();
}
list.add(t);
}
}
public static void main(String[] args) {
MyList<String> listStr=new MyList<String>();//确定了泛型的类型String
listStr.add(2);
}
}
这段代码就会报错!
二,方法泛型:方法泛型比之类泛型更为灵活,类泛型需要在实例化时,确定泛型的类型,方法泛型则可
以在方法调用时灵活的确定泛型的类型:
例如:
public class GenericMethod {
//为此方法声明已个特有的类型
static <T> T getObject(Class<T> c) {
try {
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
try {
System.out.println(getObject(Class.forName("hanzitopingyin.HanZiToPingYin")).toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
此方法可以根据Class参数,灵活的得到一个类对象。(当然有可能会说多此一举,因为Class.newInstance();就可以得到,这里只是,就灵活性做一个简单的说明。)
三,泛型的继承,(? 为通配符)
List<? extends Object> list1=new ArrayList<String>();
对于list1来说只要邮编对象的泛型是Object的子类就可以了!
List<? super String> list2=new ArrayList<String>();
对list2来说只要右边对象的泛型是String的父类就可以了!