泛型类、泛型方法、类型通配符的使用
泛型机制是在Java SE5中提出的,在此之前,使用Object引用变量可以引用所有类型的对象。在类中定义Object类型的变量,接收任意类型的数据。但是给调用者返回这个数据时,数据就被提升为Object类型,调用者需要再手动向下转型,这是利用了对象的多态性。向下转型可能会抛出ClassCastException类型转换异常。因此引入泛型机制,定义泛型类,类中定义泛型成员变量,让调用者来声明具体的数据类型。
泛型方法
在方法中声明泛型,叫做泛型方法。如果一个方法需要声明一个或多个类型参数,则可以使用泛型。泛型方法在方法声明时加上“<泛型列表>”修饰。如
public <T> void printInfo(T info){
System.out.println(info);
}
调用泛型方法时,可以显式地指定方法的类型参数,也可以不指定方法的类型参数。
如果方法的类型参数不显式地指定,那么编译器会根据传入地实参类型来自动判断类型参数。
如
Info test = new Info();
test.printInfo("a cute dog");
自定义泛型方法,将T类型的参数进行打印输出。
public class GenericMethodTest{
public static <T> void print(T input){ //泛型方法
System.out.printlb(input);
}
public static void main(String args[]) throws URISyntaxException{
int a1=1;
Integer a2=2;
char b='B';
String s="Hello";
URI u = new URI("www.baidu.com");
print(a1);
print(a2);
print(b);
print(s);
print(u);
}
}
运行结果如下:
1
2
B
Hello
www.baidu.com
泛型类
泛型类的声明实在类名后
加上“<泛型列表>”,一般形式如下:
class 类名<泛型列表>
使用泛型类声明对象时,必须指定类中使用的泛型的具体数据类型。
例:
将GenericsTest定义为泛型类。
public class GenericsTest<T>{
private T info;
public T getinfo(){
return info;
}
public void setinfo(T info){
this.info = info;
}
}
标记符
在泛型种有一些常用的大写字母作为标记符,例如E,T等。这些大写字母没有任何本质区别,只是一种习惯性命名方式。他们的区分完全是为了提高代码的可读性,因此完全可以使用别的字符串代替他们。
常用标记符如下
标记符 | 含义 |
E | Element(元素)首字母,一般用在集合里 |
T | Type(类型)首字母 |
S、U、V | 第二、第三、第四种类型 |
K | Key(键)首字母 |
V | Value(值)首字母 |
N | Number(数字)首字母 |
? | 不确定类型 |
泛型接口
泛型应用在接口上,该接口就成为泛型接口。
声明形式:
interface 接口名<泛型接口>
泛型类可以使用泛型接口
例:
public interface GenericsIntfTest<T>{
public T getinfo();
public void sentifo(T info);
}
类型通配符
泛型中的类型统配符“?”表示位置类型,用来匹配泛型参数。
通配符“?”有以下三种形式:
1、无限定通配符<?>
2、上限通配符<? extends SuperClass>,表示参数类型只能是SuperClass的子类。
3、下限通配符<? super SubClass>,表示参数类型只能式SubClass的父类。
第一种代表任何类型的通配符,第二种和第三种是有边界限制的通配符。
**参考书籍:《java SE快速入门》--中公教育优就业研究院**