前言
这边博文例子是自己测试并整理的,有点凌乱,但是耐心看下去还是能对泛型略知一二的。具体详细的泛型介绍有一篇写的很好的博客:
几个常见的符号
遇到一些泛型的代码,经常见到这几个符号,一开始学的时候也是糊里糊涂。
- E:Element,表示集合中的元素
- T:Type(Java类)
- K:key(键)
- V:value(值)
- N:number(数值类型)
- ?:表示不确定的数值类型
小例子
package genericity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class TestGenericity {
private String s = "this is string...";
public static void main(String[] args) {
//测试
One<? extends List> one = new One<ArrayList>();//正确
/*
* class Two<T extends Collection<? extends List>>
* */
//Two<List> two = new Two<List>();报错
Two<Collection<List>> two = new Two<Collection<List>>();//正确
Two<List<ArrayList<String>>> two2 = new Two<List<ArrayList<String>>>();//正确
Two<LinkedList<ArrayList<String>>> two3 = new Two<LinkedList<ArrayList<String>>>();//正确
// Two<LinkedList<Collection>> two4 = new Two<LinkedList<Collection>>();//报错,超过上限
/**
* class Three<T extends Collection<? super ArrayList>>
* */
Three<List<ArrayList>> t1 = new Three<List<ArrayList>>();//正确
Three<ArrayList<ArrayList>> t2 = new Three<ArrayList<ArrayList>>();//正确
Three<ArrayList<List>> t3 = new Three<ArrayList<List>>();//正确
//因为超过了下线ArrayList,所以会报错
// Three<ArrayList<SonOfArrayList<String>>> t4 = new Three<ArrayList<SonOfArrayList<String>>>();//正确
/*
* 测试T和Class<T>区别:
* 1. T:表示具体的对象
* 2. Class<T>:表示该T对象的类型,如果T是String则返回
* 的是Class.newInstence就是String类型的
* */
System.out.println("1:"+String.class);//class java.lang.String
System.out.println("2:"+String.class.getName());//java.lang.String
System.out.println("3:"+one.getType(String.class));//java.lang.Class
String str = new String("asd");
// System.out.println(str);//会报错,把Class<T>改为T后正确
String str2 = one.getType(str.getClass());
System.out.println("4:"+str2.toString());//java.lang.Class
try {
//得到实例str2.getClass().newInstance();获得一个String类型的对象
//5:java.lang.String
System.out.println("5:"+str2.getClass().newInstance().getClass().getName());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// str2=123;//报错
System.out.println("6:"+str2.getClass().getName());//java.lang.String
}
}
/*
* 此处的 T 为类型实参,表示T类型是Collection的子类
* */
class One<T extends Collection>{
/* 泛型方法示例
* @param <T extends Object>:指明T的类型
* @param T:返回值的类型
* @param Class<T>:表示泛型T的具体类型
* @param c:用来创建T代表的类的对象
* */
protected <T extends Object> T getType(Class<T> clazz){
return (T) clazz.getClass().getName();
}
}
/* ?表示有限制的通配符,表示不确定的类型
* extends:确定泛型的上限
* */
class Two<T extends Collection<? extends List>>{
}
/*
* super确定了泛型的下限
* */
class Three<T extends Collection<? super ArrayList>>{
}
//ArrayList的子类
class SonOfArrayList<E> extends ArrayList<E>{
}