读书笔记–《写给大忙人的JavaSE 9 核心技术》—第6章
泛型编程
Java是强类型的语言,对于函数中的参数需要声明其类型,当需要实现适用于多中类型的方法和类时,此时需要用到泛型。
泛型类
public class Test1<K,V> {
public test1(K key,V value) {
System.out.println(key);
System.out.println(value);
}
}
// 正确
Test1 t = new Test1("key",6);
// 正确,此时Test1<String,Integer>这里指定的泛型类型,无效。
Test1<String,Integer> t2 = new Test1("key","6");
// 错误,参数类型要和前面指定的一样,不然编译器无法推断类型
Test1<String,Integer> t2 = new Test1<>("key","6");
注意:
泛型里面参数不能用基本数据类型,要用他们的包装类!就是说尖括号里面不能放基本类型。
错误
正确
泛型方法
public <T> void say(T t) {
System.out.println(t.toString());
}
public <T> T[] say2(T[] t,int i,int j) {
T temp = t[i];
t[i] = t[j];
t[j] = temp;
return t;
}
泛型的通配符
public void say3(LinkedList<?> temp){
System.out.println(temp.size());
// 错误,采用了通配符后,这个里面是只读的。
temp.set(0,"777");
}
通配符上下界
? extends Test1 表示一个未知的Test1的子类
? super Test1 表示一个未知的Test1的父类
//上转型是安全的,下转型是不安全的
//能取,不能存,
public void method(List<? extends Test1> holder, Test1 arg){
holder.add(arg); //error
Test1 t = holder.get(0);
}
// 能存,不能取,
public void method(List<? super Test1> holder, Test1 arg){
holder.add(arg);
Test1 t = holder.get(0); //error
}