黑马程序员技术交流社区
标题:
关于泛型的上下限。
[打印本页]
作者:
王小五
时间:
2012-11-24 15:33
标题:
关于泛型的上下限。
关于泛型的上下限问题这方面一直不太明白, 谁能给举例解释一下呀,谢谢。
作者:
李有
时间:
2012-11-24 15:35
泛型的限制范围与它的方式有关,具体如下:
1、<?>允许所有泛型的引用调用
2、<? extends Number> 只允许泛型为Number及Number子类的引用调用
3、<? super Number> 只允许泛型为Number及Number父类的引用调用
4、<? extends Comparable> 只允许泛型实现Comparable接口的实现类的引用调用
作者:
潘天功
时间:
2012-11-24 16:24
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 内容:潘天功
}
}
希望能帮助你
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2