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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wojiaojay 中级黑马   /  2014-5-28 19:49  /  1470 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是泛型?上下限什么时候用?


不知道该怎么表示更合理,求大家帮忙总结一下吧!!!

毕姥爷的视频里说过上下限,但是感觉没说太详细呢......:dizzy::dizzy::dizzy:

4 个回复

倒序浏览

不会
以下来自度娘

泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。
因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要让程序通过编译,必须将 get() 的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。
理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
上限就是指一个操作泛型最大的操作父类,例如,现在最大的上限设置成"Number",那么此时,所能够接受的类型最高为Number上限,及其"Number" 的子类
1)上限设置语法:
    Class A<? extends 父类>//"?"表示:未指定的泛型类型;如果实例化类型为:Integer,Double...而其上限父类自然就是"Number"
2)例子:
public class Point<A extends Number> {
       
        private A x;
        private A y;
       
        public A getX() {
                return x;
        }
        public void setX(A x) {
                this.x = x;
        }
        public A getY() {
                return y;
        }
        public void setY(A y) {
                this.y = y;
        }
       
}
public static void main(String args[]){
    Point<Integer> t1 = new Point<Integer>();//Number的子类,实例化成功
    Point<String> t2 = new Point<String>();//实例化失败,类型受制
    Point<Double> t3 = new Point<Double>();//Number的子类,实例化成功
    Point<Object> t4 = new Point<Object>();//实例化失败,类型受制
    fun(t1);
    fun(t2);//报错
    fun(t3);
    fun(t4);//报错
}
public static void fun(Point<? entends Number> t){//表示,此时可以Number的子类
    System.out.println(t.getX());               
    System.out.println(t.getY());       
}
4、泛型下限(可以自己定义类)
含义:指的是只能设置其具体的类或者父类。
*******只能在方法中设置******
1)设置语法:
<? super 类>
2)例子
public class Point<A> {
       
        private A x;
        private A y;
       
        public A getX() {
                return x;
        }
        public void setX(A x) {
                this.x = x;
        }
        public A getY() {
                return y;
        }
        public void setY(A y) {
                this.y = y;
        }
       
}
public static void main(String args[]){
    Point<Integer> t1 = new Point<Integer>();//实例化失败,类型受制
    Point<String> t2 = new Point<String>();//String没有子类,为下限,实例化成功
    Point<Double> t3 = new Point<Double>();//实例化失败,类型受制
    Point<Object> t4 = new Point<Object>();//只限制下限,而Object为String父类,实例化成功
    fun(t1);//报错
    fun(t2);
    fun(t3);//报错
    fun(t4);
}
public static void fun(Point<? super String> t){//设置下限,只能接受String或Object对象
    System.out.println(t.getX());               
    System.out.println(t.getY());       
}
回复 使用道具 举报
TS__likewise 发表于 2014-5-28 20:59
不会
以下来自度娘

呵呵,用自己的花概括下嘛。
回复 使用道具 举报
宋健敏 发表于 2014-5-28 22:52
呵呵,用自己的花概括下嘛。

恩,谢谢,我看看哈!!!!
回复 使用道具 举报
TS__likewise 发表于 2014-5-28 20:59
不会
以下来自度娘

辛苦啦,我总结一下!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马