在泛型操作中也可以通过通配符接收任意指定泛型类型的对象
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用时泛型类型必须匹配才可以传递,否则是无法传递的
class Info<T>{//此处可以是任意的标识符号,T 是 type 的简称
private T var;//此变量的类型由外部决定
public T getVar(){
return var;//返回值的类型由外部指定
}
public void setVar(T var){
this.var = var;//设置的类型由外部指定
}
public String toString(){
//覆写Object类中的 toString() 方法
return this.var.toString();
}
}
public class Test{
public static void main(String[] args) {
Info<String > i = new Info<String>();//指定String为泛型类型
i.setVar("Java");
fun(i);//错误无法传递
}
public static void fun(Info<Object> temp){//此处可以接收 Object 泛型类型的 Info对象
System.out.println("内容:" + temp);
}
}
以上程序尽管 String 是 Object 类的子类,但是在进行引用传递时也同样无法进行操作,如果此时想让程序正确执行,可以将 fun() 方法中定义的 Info<Object>
修改为Info,即不指定泛型。
public class Test{
public static void main(String[] args) {
Info<String > i = new Info<String>();//指定String为泛型类型
i.setVar("Java");
fun(i);
}
public static void fun(Info temp){//此处可以接收 Info 的对象
System.out.println("内容:" + temp);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
此时程序编译时不会出现任何的语法错误,程序可以正常地使用,但是在编写 fun() 方法时 Info 中并没有指定任何的泛型类型,这样做有些不妥,为了解决这个问题,Java中引入了通配符“?”
,表示可以接收此类型的任意泛型对象
public class Test{
public static void main(String[] args) {
Info<String > i = new Info<String>();//指定String为泛型类型
i.setVar("Java");
fun(i);
}
public static void fun(Info<?> temp){//此处可以接收 Object 泛型类型的 Info对象
System.out.println("内容:" + temp);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
程序中使用Info<?>
的代码形式,表示可以使用任意的泛型类型对象,这样做的话 fun()
方法定义的就比较合理了,此时使用需要注意,如果使用 “?” 接收泛型对象时,则不能设置被泛型指定的内容。
public class Test{
public static void main(String[] args) {
Info<?> i = new Info<String>();//指定String为泛型类型
i.setVar("Java");//错误,无法设置
}
}
- 1
- 2
- 3
- 4
- 5
- 6
此时将一个字符串设置给泛型所声明的属性,因为使用 Info<?>
的形式,所以无法将内容设置给 var 属性,但此时可以设置 null 值。
public class Test{
public static void main(String[] args) {
Info<?> i = new Info<String>();//指定String为泛型类型
i.setVar(null);
}
}
- 1
- 2
- 3
- 4
- 5
- 6