Java泛型在Java1.5引入的一种特性,这种特性带来的好处就是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的,而且在代码不规范的情况下,一不小心就报个ClassCastException(类型转换异常);
举个栗子:
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("西西");
list.add(100);
list.add(list);
//转换正常
String el1 = (String) list.get(0);
//编译通过,运行报ClassCastException转换异常
String el2 = (String) list.get(1);
}
public static void main(String[] args) {
//改成String类型
List<String> list = new ArrayList<>();
list.add("西西");
//下面两个添加编译不通过
list.add(100);
list.add(list);
}
泛型该如何使用?
public static void main(String[] args) {
//泛型使用String类型,也只能使用Sting类型
Single<String> singleString = new Single<>();
singleString.setName("西西");
//传入String类型就获取String类型
String nameString = singleString.getName();
//泛型使用Interge类型,也只能设置Integer类型
Single<Integer> singleInteger = new Single<>();
singleInteger.setName(1);
//传入Integer类型就获取Integer类型
Integer nameInterge = singleInteger.getName();
}
static class Single<T>{
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
还能这么用:
/**
* 只能传入继承自Number的类,如Integer、Long等
* @param <T>
*/
static class Single<T extends Number>{
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
//使用通配符
public static void method1(List<?> list) {
......
}
//使用泛型方法
public <T> void method2(List<T> tList) {
......
}
//使用裸类型方法
public <T> void method3(List list) {
......
}
此时很多人又有疑问,使用?和和T有什么区别?该如何使用呢?
//使用通配符
public static void method1(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
//使用泛型方法
public <T> void method12(List<T> tList) {
for (T t : tList) {
System.out.println(t);
}
}
//使用裸类型方法
public <T> void method3(List list) {
for (Object o : list) {
System.out.println(o);
}
}
泛型与通配符选择使用原则是:
- 如果参数之间的类型有依赖关系,或者返回值是与参数之间有依赖关系的,那么就使用泛型方法,比如需要在方法内调用相应对象的方法;
- 如果没有依赖关系的,就使用通配符,通配符会灵活一些
泛型的原理实现
Java泛型的缺陷
//编译报错
public static void method(List<String> list) {
System.out.println("List<String>");
}
public static void method(List<Integer> list) {
System.out.println("List<Integer>");
}
public static void main(String[] args) {
//输出List<String>
method(new ArrayList<String>());
//输出List<Integer>
method(new ArrayList<Integer>());
}
public static String method(List<String> list) {
System.out.println("List<String>");
return "西西";
}
public static int method(List<Integer> tList) {
System.out.println("List<Integer>");
return 1;
}
转载请注明:XAMPP中文组官网 » Java泛型好处与坏处_泛型的原理实现