黑马程序员技术交流社区
标题:
泛型,说说上下限的问题!!!
[打印本页]
作者:
wojiaojay
时间:
2014-5-28 19:49
标题:
泛型,说说上下限的问题!!!
什么是泛型?上下限什么时候用?
不知道该怎么表示更合理,求大家帮忙总结一下吧!!!
毕姥爷的视频里说过上下限,但是感觉没说太详细呢......:dizzy::dizzy::dizzy:
作者:
TS__likewise
时间:
2014-5-28 20:59
不会
以下来自度娘
泛型(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());
}
作者:
宋健敏
时间:
2014-5-28 22:52
TS__likewise 发表于 2014-5-28 20:59
不会
以下来自度娘
呵呵,用自己的花概括下嘛。
作者:
wojiaojay
时间:
2014-5-29 22:42
宋健敏 发表于 2014-5-28 22:52
呵呵,用自己的花概括下嘛。
恩,谢谢,我看看哈!!!!
作者:
wojiaojay
时间:
2014-5-29 22:57
TS__likewise 发表于 2014-5-28 20:59
不会
以下来自度娘
辛苦啦,我总结一下!!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2