您的位置:首页 > 编程语言 > Java开发

Java泛型与继承的关系

2015-08-23 21:36 381 查看
示例代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.Test;

public class TestGeneric {
/**
* 泛型与继承的关系:
* 若类A是类B的子类,那么List<A>就不是List<B>的子接口
*/
@Test
public void test1() {
Object obj = null;
String str = new String("AA");
obj = str;//向上转型

Object[] obj1 = null;
String[] str1 = new String[]{"AAA","BBB"};
obj1 = str1;//向上转型

List<Object> lo = null;
List<String> ls = new ArrayList<String>();
//lo = ls;//错误,List<String>不是List<Object>的子接口
}

/*
* 通配符 ?
* List<A>、List<B>、。。。。都是List<?>的子类
*
* ? extends A :可以存放A及其子类
* ? super A:可以存放A及其父类
*/
@Test
public void test2() {
List<?> list = null;
List<Object> lo = new ArrayList<Object>();
List<String> ls = new ArrayList<String>();
list = lo;
list = ls;
show1(lo);

List<? extends Number> ln = null;
List<Integer> lin = new ArrayList<Integer>();
ln = lin;
List<Object> lob = new ArrayList<Object>();
//ln = lob;//错误,? extends A :可以存放A及其子类

List<? super Number> ln2 = null;
ln2 = lob;
//ln2 = lin;//错误,? super A:可以存放A及其父类
}

public <T> void show1(List<T/*此处T相当于传进来的类型*/> list) {

}
public void show2(List<?/*此处?相当于传进来的类型的父接口类型*/> list) {

}

@Test
public void test3() {
List<String> ls = new ArrayList<String>();
ls.add("aa");
ls.add("bb");
ls.add("cc");
List<?> li = ls;
//可以读取声明为通配符的集合对象
Iterator it = li.iterator();
while(it.hasNext()) {
Object o = it.next();
System.out.println(o);
}

//不能写进声明为通配符的集合对象,除了唯一例外的null
//li.add("dd");//错误
//li.add(12);//错误
li.add(null);

List<String> lstr = (List<String>)li;//强转回原来的类型就可以写进
lstr.add("ll");
System.out.println(lstr);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: