老师讲到:
public class Generic <T>{
private T flag;
public void setFlag(T flag){
this.flag=flag;
}
public T getFlag(){
return this.flag;
}
}
public class Showmsg {
public void showflag(Generic<?> generic){
System.out.println(generic.getFlag());
}
}
public class Test {
public static void main(String[] args) {
Showmsg showmsg=new Showmsg();
Generic<Integer>generic1=new Generic<>();
generic1.setFlag(20);
showmsg.showflag(generic1);
Generic<Number>generic=new Generic<>();
generic.setFlag(50);
showmsg.showflag(generic);
}
}
我的理解是?和其他通配符一样,只是便于理解认为的做出划分
为了验证我的猜想,我把第一段中的T全部改成了?如下:
public class Generic <?>{
private ? flag;
public void setFlag(? flag){
this.flag=flag;
}
public ? getFlag(){
return this.flag;
}
}
但是,改完之后就全红了,idea也没给什么提示,好像?不能做通配符似的
难道?不能作为声明定义中的通配符?
我就又把代码还原,在第三段中加了一句
Generic<?>g=new Generic<>();
ok,没报错,然后又加了句
g.setFlag("56");
结果又报错了,看提示应该是56作为参数格式不对,那为什么上一句没报错呢?
另外还想问一下,各个通配符在语法上是否存在不同含义,具体使用方法又有什么不同呢?