现在的位置: 首页 > 综合 > 正文

18—java中泛型02(通配符)

2013年10月09日 ⁄ 综合 ⁄ 共 2068字 ⁄ 字号 评论关闭

 

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>接受;
  

抱歉!评论已关闭.