1、泛型统配符?:
泛型对象进行引用传递的时候,类型必须一致;
以下会报错:
class Info<T>{
private T var;//定义泛型变量
public void setVar(T var){
this.var=var;
}
public T getVar(T var){
return this.var;
}
public String toString(){
return this.var.toString();
}
}
public class Demo{
public static void main(String args[]){
Info<String> i=new Info<String>();//创建String泛型类型的Info对象
i.setVar("lid");
fun(i);
}
public static void fun(Info<Object> temp){//接受Object泛型类型的Info对象
System.out.println("内容:"+temp);
}
}
如果非要传递,则可以将Info<Object> temp改为Info temp,但是这样改不合适我没可以改成
这样的Info<?> temp,使用通配符?可以接受任意类型的泛型;
如果使用?意味着可以接受任意的内容,但是此内容却无法直接使用<?>修饰的泛型对象进行修改;
Info<?> i=new Info<String>();
i.setVar("lid");
以上是错误的;
2、设置泛型;
之前设置泛型类型的时候,实际上都是可以任意设置的,只要是类就可以设置,但是zaijava中
可以指定一个泛型的上限和下限(最大到那个父类最小到那个子类);
设置上限:
类名称<? extends 类> 对象名称
设置下限:
类名称<? super 类> 对象名称
上限:
class Info<T extends Number>{
private T var;//定义泛型变量
public void setVar(T var){
this.var=var;
}
public T getVar(T var){
return this.var;
}
public String toString(){
return this.var.toString();
}
}
public class Demo{
public static void main(String args[]){
Info<Integer> i1=new Info<Integer>();
Info<Float> i2=new Info<Float>();
i1.setVar(20);
i2.setVar(30.1f);
fun(i1);
fun(i2);
}
public static void fun(Info<? extends Number> temp){
//只能接受Number类型及其类类型的数据
System.out.println(temp+"、");
}
}
下限:当使用的泛型只能在本类及其父类类型上应用的时候,就必须使用泛型的范围下限配置
class Info<T>{
private T var;//定义泛型变量
public void setVar(T var){
this.var=var;
}
public T getVar(T var){
return this.var;
}
public String toString(){
return this.var.toString();
}
}
public class Demo{
public static void main(String args[]){
Info<String> i1=new Info<String>();
Info<Object> i2=new Info<Object>();
i1.setVar("lid");
i2.setVar(new Object());
fun(i1);
fun(i2);
}
public static void fun(Info<? super String> temp){
System.out.println(temp+"、");
}
}
以上只能是String和Object类型;
3、泛型与子类继承的限制:
一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型类型操作中,
子类的泛型类型是无法使用父类的泛型类型接受的,例如:Info<String>不能
用Info<Object>接受;