一、泛型通配符引入
当使用一个泛型类时(包括声明变量和创建对象两种情况),都应该为该泛型传入一个类型实参。如果没有传入类型实际参数,编译器就会提出泛型警告。
例如定义一个方法,方法里有一个集合形参,集合形参的元素类型是不确定的,该怎么定义?
public void test(List c)
{
for(var i=0;i<c.size();i++)
{
System.out.println(c.get(i));
}
}
上面的程序问题是List是一个有泛型声明的接口,此处的List接口并没有传入实际类型参数,这将引起泛型警告。为此考虑为List接口传入实际的类型参数——因为因为List集合里的元素类型是不确定的,将上面的方法改为如下形式:
public void test(List<Object> c)
{
for(var i=0;i<c.size();i++)
{
System.out.println(c.get(i));
}
}
上面代码的问题是调用该方法传入的实际参数值可能不是我们所期望的,例如,下面代码试图调用该方法:
import java.util.*;
class GenericTest
{
public void test(List<Object> c)
{
for(var i=0;i<c.size();i++)
{
System.out.println(c.get(i));
}
}
public static void main(String[] args)
{
//创建一个List<String>对象
List<String> strList=new ArrayList<>();
strList.add("A");
strList.add("B");
//将strList作为参数来调用前面的test方法
GenericTest g=new GenericTest();
g.test(strList);
}
}
---------- 编译Java ----------
GenericTest.java:19: 错误: 不兼容的类型: List<String>无法转换为List<Object>
g.test(strList);
^
注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
1 个错误
输出完成 (耗时 2 秒) - 正常终止
上面程序将报错,这表明List