您的位置:首页 > 其它

泛型的通配符问题

2016-06-06 00:00 239 查看
摘要: 泛型是把类型作为一种参数来指定,使用泛型之后类型就不是一成不变的了 ,而是通过参数来进行设定。泛型可以是系统JAVA中的 类 ,也可以是自己创建的类, 另外还有泛型通配符,无限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限代表最高继承与T 类型 ,下限代表最低是T类型 或是T的 父类 。以下 介绍几种泛型的使用例子。

泛型是把类型作为一种参数来指定,使用泛型之后类型就不是一成不变的了 ,而是通过参数来进行设定。泛型可以是系统JAVA中的 类 ,也可以是自己创建的类, 另外还有泛型通配符,无限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限代表最高继承与T 类型 ,下限代表最低是T类型 或是T的 父类 。以下 介绍几种泛型的使用例子。
`

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

//泛型的通配符问题
public class Ex_21 {

// 演示1:泛型参数不会主动考虑继承关系

public void test() {
List<B> listB = new ArrayList<B>();
List<C> listC = new ArrayList<C>();
List<A> listA = new ArrayList<A>();
// 遍历输出B
print_1(listB);
print_1(listA);
print_1(listC);
//        print_2(listB);
//        print_2(listA);
//        print_2(listC);
}
//输出
public void print_1(Collection<?> c) {
for (Object obj : c) {
System.out.println(obj);
}
}
//输出方法
public  void print_2(Collection<Object> c){
for(Object obj: c){
System.out.println(obj);
}
}
/*
* 总结 :明显 第二种会报错, Object 其父类 但是 泛型 不会主动考虑继承关系
*
*/
//演示2: 通配符 上界
public void test2(){
List<? extends A> listA = new ArrayList<A>();
//		listA.add(new A());
//假如想加入 A的类型 和A的子类怎么办?
//如下处理就可以
List<A> list = new ArrayList<A>();
list.add(new A());
list.add(new B());
list.add(new C());
//无法使用 带有泛型通配符的引用调用 泛型的方法
}
//演示3: 自定义泛型方法
这个比较常用  泛型方法 可以接受 不同类型参数 实现相同功能 ;
public static <T>T getLast(T[] a){
return a[a.length-1] ;
}
public void test3(){
String [] str = {"100","200","300"};
Integer [] in = {400,500,600};
Ex_21.<String> getLast(str);
Ex_21.<Integer> getLast(in);
}
//演示4: 实现指定类型 ,容器类型
public void test4(){
M_value <Integer> m = new M_value<Integer>();
m.setValue(100);
Integer i  = m.getValue();
System.out.println(i);

}
//该类封装了数据, 数据 继承了Number 并且实现了Serialziable 和 Comparable 接口
class M_value <M extends Number & Serializable & Comparable>{
private M value;
public M getValue(){
return value;
}
public void setValue(M value){
this.value = value;
}
}`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: