1、若不使用泛型,从List,set等容器中取出成员时,返回的类型都是Object型的。
import java.util.ArrayList;
import java.util.List;
public class ClassA {
public static void main(String args[]){
String s1="hello",s2;
int n1=0,n2;
ClassA a1=new ClassA();
ClassA a2;
List list1=new ArrayList();
list1.add(s1);
list1.add(n1);
list1.add(a1);
//s2=list1.get(0);
//n2=list1.get(1);
//a2=list1.get(2);
//以上三行报错,因为返回类型Object与变量类型不一致。
s2=(String) list1.get(0);
n2=(int) list1.get(1);
a2=(ClassA) list1.get(2);
}
}
2、若使用泛型,则无需在get()返回后进行强制类型转换。
import java.util.ArrayList;
import java.util.List;
public class ClassA {
public static void main(String args[]) {
String s1 = "hello", s2;
int n1 = 0, n2;
ClassA a1 = new ClassA();
ClassA a2;
List<String> list1 = new ArrayList<String>();//使用了泛型
List<Integer> list2 = new ArrayList<Integer>();//注意此处< >内不是int而是Integer,Integer是一个对象
List<ClassA> list3 = new ArrayList<ClassA>();//同上
list1.add(s1);
list2.add(n1);
list3.add(a1);
//不需要强制类型转换
s2 = list1.get(0);
n2 = list2.get(0);
a2 = list3.get(0);
}
}
3、泛型与多态并不冲突。
4、基本类型不能作为类型参数,但JAVA SE5中就具备了自动打包与拆包的功能。简单地说就是要用<Integer>而不是<int>,但如果返回值的类型为int也能默认地被转换为Integer类型。
5、泛型类的语法:class man<T>{ } 。 泛型接口的语法:interface man<T>{ } 。泛型方法的语法:public <T> void man(T t){ }
要注意的是:①对于泛型类,新建该类对象时必须要将具体的类型传入,如:new man<String>();②对于泛型接口,必须在implements该接口时传入具体值,如:class Human implements man<String>{ }③对于泛型方法,不需要传入具体值,因为Java有一种叫类型参数推断的机制。如:man("haha");该机制能够自动识别参数类型。(要强调的是在泛型方法的语法中,<T>也只是一个参数类型,他并不表示返回类型。不过当然返回类型也可以使用带有泛型的形式,如:public <K,V> Map<K,V> man(){ },并且这种机制只对赋值操作有效,如果将泛型方法的返回值作为一个参数编译器只是将这个值当做一个Object类的对象来处理)
6、泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用