通过定义一个普通类和一个泛型类进行对比:
(1)普通类:
class Bag{
private Object data;
public void add(Object obj){
data=obj;
}
public Object get(){
return data;
}
}
(2) 泛型类:
class Bag<T>{
private T data;
public void add(T t){
data=t;
}
public T get(){
return data;
}
}
注:
1、T 不可用在类型中的静态方法、静态属性上,因为T的类型是在实例中确定,故不可以类初始化
2、T必须是引用类型
interface INfo<T>{
public void setVar(T t);
}
class InfoImp1<T> implements Info<T>{ //泛型类的定义不必要在此时确定T的类型,可在实例中定义
public void setVar(T t){
System.out.println("泛型类实现接口的内容"+t);
}
}
class InfoImp2 implements Info<String>{ //普通类的定义必须要在此时确定T的类型
public void setVar(T t){
System.out.println("普通类实现的接口:"+t);
}
}
public class GenericInterfaceTest{
public static void main(String[] args){
InfoImpl<String> i1=new InfoImp1<String>();
i1.setVar(“泛型类”);
InfoImp2 i2=new InfoImp2();
i2.setVar("普通类");
}
}
- 泛型类
- 泛型接口
- 泛型方法
在Java的反省中,类型参数也可以用在方法的参数或者返回之中,这样的方法被称为泛型方法。泛型方法要在函数的修饰符之后、返回值之前声明类型参数,然后再方法的参数或者返回值处使用合适的类型参数即可,要注意这个类型参数的作用域仅限于方法内部。另外,泛型方法调用时,不需要显式地传递实参的类型,像普通方法调用即可。这主要是Java编译器具有类型推理能力,根据调用的泛型方法的参数的类型,推理得出被调用方法中类型变量的具体类型,并据此检查方法调用中类型的正确性。
public class GenericMethodTest{
public static void main(String[] args){
Integer i=new Integer(100);
String s="abc";
printdata(i);
printdata(s);
}
public static<T> void printdata(T t){
System.out.println("T的类型是"+t.getClass().getName());
System.out.println("T的内容是"+t);
}
}