java中的泛型
泛型:
为什么要泛型:
a.解决元素存储的安全性问题, 好比商品、 药品标签, 不会弄错。
b.解决获取数据元素时, 需要类型强制转换的问题, 好比不用每回拿商品、 药
品都要辨别
在集合中使用泛型有什么好处
上代码:
ArrayList<Integer> list = new ArrayList<>();//类型推断
list.add(78);
list.add(88);
list.add(77);
list.add(66);
//遍历方式一:
//for(Integer i : list){
//不需要强转
//System.out.println(i);
//}
//遍历方式二:
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom1",34);
map.put("Tom2",44);
map.put("Tom3",33);
map.put("Tom4",32);
//添加失败
//map.put(33, "Tom");
Set<Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Entry<String,Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String,Integer> entry = iterator.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
好处:使用泛型的主要优点是能够在编译时而不是在运行时检测错误
泛型的声明:
interface List<T> 和 class GenTest<K,V>
其中, T,K,V不代表值,而是表示类型。 这里使用任意字母都可以。
常用T表示,是Type的缩写
泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
注意:
a.T只能是类,不能用基本数据类型填充。但可以使用包装类填充
b.把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想
通配符:' ? '(英文的问号)
比如: List<?> , Map<?,?>
List<?>是List<String>、 List<Object>等各种泛型List的父类。
使用案例:
public static void main(String[] args) {
List<?> list = null;
list = new ArrayList<String>();
list = new ArrayList<Double>();
// list.add(3);//编译不通过
list.add(null);
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
l1.add("尚硅谷");
l2.add(15);
read(l1);
read(l2);
}
public static void read(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
注意点:
1:编译错误:不能用在泛型方法声明上,返回值类型前面<>不能使用?
public static <?> void test(ArrayList<?> list){
}
2:编译错误:不能用在泛型类的声明上
class GenericTypeClass<?>{
}
3:编译错误:不能用在创建对象上,右边属于创建集合对象
ArrayList<?> list2 = new ArrayList<?>();
有限制的通配符
只允许泛型为Number及Number子类的引用调用
<? extends Number> // (无穷小 , Number]
只允许泛型为Number及Number父类的引用调用
<? super Number> //[Number , 无穷大)
只允许泛型为实现Comparable接口的实现类的引用调用
<? extends Comparable>
通配符的使用
public static void printCollection3(Collection<? extends Person> coll) {
//Iterator只能用Iterator<?>或Iterator<? extends Person>.why?
Iterator<?> iterator = coll.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
public static void printCollection4(Collection<? super Person> coll) {
//Iterator只能用Iterator<?>或Iterator<? super Person>.why?
Iterator<?> iterator = coll.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}