public void fun(T t){
//编译成功
}
public void fun(T t){
//两个上界都是对象,编译失败
}
public void fun(T t){
//类不是第一个上界,编译失败
}
public void fun(T t){
//编译成功
}
泛型的传参类型不能混淆,比如String虽然是Object的子类,但是List不是List
public class Test{
public static void fun(List
但是参数定义中设置上界,就能解决这个问题,即List是List的资关系,如:
public class Test{
public static void fun(List list){
}
public static void main(String[] main){
List stringList = new ArrayList<>();
List objectList = new ArrayList<>();
fun(stringList);//编译通过
fun(objectList);//编译通过
}
}
形参
当泛型作为某个形参定义时,在函数体内的使用是不确定具体类型的,如:
public static void fun(List list){
list.add(new Object());//编译不通过
list.add("字符串");//编译不通过
list.add(null);//编译通过
String s = list.get(0);//编译通过
}
public class Test{
public static void fun1(List> list){
//无界限
}
public static void fun2(List extends Object> list){
//设置上界
}
public static void fun3(List super String> list){
//设置下界
}
}
通配符上界与泛型上界的用法及注意事项基本一致,但是只支持单个上界。
通配符的下界限定与上界限定对函数体中入参的使用会带来不一样的影响。
public static void fun3(List super String> list){
list.add("字符串");//编译通过
String s = list.get(0);//编译不通过
}