泛型的本质就是将类型参数化。在Java程序中,我们不仅可以将数据设置为参数,类型也是可以作为参数的。
例:泛型类
class GeneralType <Type> {
Type object;
public GeneralType(Type object) {
this.object = object;
}
public Type getObj(){
return object;
}
}
在这里我们将generalType类声明为泛型类,Type,是个泛型参数,实际上是一个类型参数。不仅数据可以作为参数,类型也是可以作为参数的。也就是说我们实际使用这个GeneralType类的时候,是需要给出一个类型实参的,然后根据类型实参,能够确定这一次使用GeneralType类它里面的属性是什么类型的,它的方法处理的是什么类型的数据,方法的反馈是什么类型的。
测试
public class Test{
public static void main(String args[]){
GeneralType<Integer> i = new GeneralType<Integer> (2);
GeneralType<Double> d = new GeneralType<Double> (0.33);
System.out.println("i.object=" + (Integer)i.getObj());
System.out.println("i.object=" + (Integer)d.getObj());
/*这一句会编译错误,d所指向的对象是用类型实参double来构造
的GeneralType对象,所以它的getObj()返回的是一个double
对象,如果硬要转换成Integer,是没法转换的,会出现编译错误。*/
}
}
泛型方法
class GeneralMethod {
<Type> void printClassName(Type object) {
System.out.println(object.getClass().getName());
}
}
public class Test {
public static void main(String[] args) {
GeneralMethod gm = new GeneralMethod();
gm.printClassName("hello");
gm.printClassName("3");
gm.printClassName("3.0f");
gm.printClassName("3.0");
}
}
使用通配符
class GeneralType <Type> {
Type object;
public GeneralType(Type object) {
this.object = object;
}
public Type getObj(){
return object;
}
}
class ShowType {
public void show (GeneralType<?> o) {
System.out.println(o.getObj().getClass().getName());
}
}
public class Test {
public static void main(String[] args) {
ShowType st = new ShowType();
GeneralType<Integer> i = new GeneralType<Integer> (2);
GeneralType<String> s = new GeneralType<String> ("hello");
st.show(i);
st.show(s);
}
}
程序的运行结果如下:
java.lang.Integer
java.lang.String
有限制的泛型
在参数“Type”后面使用“extends”关键字并加上类名或接口名,表明参数所代表的类型必须是该类的子类或者实现了该接口。
注意:对于实现了某接口的有限制泛型,也是使用extends关键字,而不是implements关键字。
class GeneralType <Type extends Number> {
Type object;
public GeneralType(Type object) {
this.object = object;
}
public Type getObj(){
return object;
}
}
public class Test {
public static void main(String[] args) {
GeneralType<Integer> i = new GeneralType<Integer> (2);
//GeneralType<String> s = new GeneralType<String> ("hello");
//非法,T只能是Number或Number的子类
ps:笔记根据郑莉教授Java语言程序设计视频整理