A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小五 中级黑马   /  2012-11-24 15:33  /  1208 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于泛型的上下限问题这方面一直不太明白, 谁能给举例解释一下呀,谢谢。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

倒序浏览
泛型的限制范围与它的方式有关,具体如下:
1、<?>允许所有泛型的引用调用
2、<? extends Number> 只允许泛型为Number及Number子类的引用调用
3、<? super Number> 只允许泛型为Number及Number父类的引用调用
4、<? extends Comparable> 只允许泛型实现Comparable接口的实现类的引用调用

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
1、在引用传递中,在泛型操作中也可以设置一个泛型对象的范围上限和下限。
   范围上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类。
   范围下限使用super进行声明,表示泛型的类型可能是所指定的类型,或者是此类型的父类型。
      上限格式:
                 声明对象:类名称<?extends 类>对象名称
                 定义类:[访问权限] 类名称<泛型标识 extends 类>{}
          下限格式:
                 声明对象:类名称<?super 类>对象名称
                 定义类:[访问权限] 类名称<泛型标识 extends 类>{}
2、泛型的上限
    现在设计一个方法中能接收的泛型对象只能是数字(Byte、Short、Long、Integer、Float、Double)类型,此时在定义方法参数接收对象时,就必须指定泛型的上限。因为所有的数字都是Number的子类,具体代码如下:
    设置方法只能接收泛型为Number类型
      public class GenericsDemo1{
                public static void main(String[] args){
                           Info<Integer>  i1  = new Info<Integer>();          //声明 Integer的泛型对象
                           Info<Float>  i2  = new Info<Float>();                 //声明 Float的泛型对象
                           i1.setVar(30) ;                                                   //设置整数,自动装箱
                           i2.setVar(30.1f);                                                //设置小数,自动装箱
                 fun(i1);                                                            //是数字,可以传递
                           fun(i2);                                                             //是数字,可以传递
           }
           //接收Info 对象,范围上限设置为Number,所以只能接收数字类型
       public static void fun(Info<? extends Number>temp){
                    System.out.print(temp+"、");     //运行结果:30、30.1
              }
}
3、泛型下限
    当使用的泛型只能在本类及其父类类型上应用时,就必须使用泛型的下限进行配置。代码体现如下:
    class Info<T>{                                //此处泛型只能是数字类型
                  private T var;                       //此处变量的类型由外部决定
                  public T getVar(){                 //返回值的类型由外部决定
                          return var;
         }
             public void setVar(T var){                 //设置的类型由外部指定
                       this.var = var;
         }
             public String toString(){
                           return this.var.toString()                    //覆写Object类中的toString()方法
        }
}
public class GenericsDemo2{
               public static void main(String[] args){
                           Info<Object>  i1  = new Info<Object>();                            //满足下限范围
                 Info<Stringt>  i2  = new Info<Stringt>();                           //满足下限范围
                           i1.setVar(new Object()) ;                                   //设置Object对象
                           i2.setVar(“潘天功");                                          //设置字符串
                           fun(i1);                                                           
                           fun(i2);                                                            
           }
            public static void fun(Info<? super String>temp){    //只能接收String或Object类型的泛型
                    System.out.print(“内容:"+temp);     //运行结果:内容:java.lang.Object@757aef       内容:潘天功
              }
}
   希望能帮助你

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马