package com.btp.t4;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.junit.Test;
/*
* 泛型的使用
* 1.在集合中使用泛型
* 2.自定义泛型类,泛型接口,泛型方法
* 3.泛型与继承的关系
* 4.通配符
*/
public class TestGeneric {
//1,在集合中没有使用泛型的情况下
@Test
public void test1(){
List list =new ArrayList();
list.add(89);
list.add(67);
list.add(87);
//没有使用泛型,任何Object及其子类对象都能添加进来
list.add(new String("xiaoming"));
for(Object obj:list)
{
//2.强转为int型时,可能报ClassCastException的异常
int Score=(Integer)obj;
System.out.println(Score);
}
}
//在集合中使用泛型
@Test
public void test2(){
List<Integer> list =new ArrayList<Integer>();//只能添加Integer类型的对象
list.add(89);
list.add(67);
list.add(87);
//list.add(new String("xiaoming"));//添加不进来
Iterator<Integer> it=list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
//Map使用泛型
@Test
public void test3(){
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("kobe", 100);
map.put("kobe1", 100);
map.put("kobe2", 100);
map.put("kobe3", 100);
Set<Entry<String, Integer>> set=map.entrySet();//泛型可以嵌套,Entry是Map中的一个内部类
for(Entry<String, Integer> o:set){
System.out.println(o.getKey()+"--->"+o.getValue());
}
}
//自定义泛型类的使用
@Test
public void test4(){
//1.当实例化泛型类的对象时,指明泛型的类型
//指明以后,对应的类中所有使用泛型的位置,都变为实例化中指定的泛型的类型
//2.如果我们自定义了泛型类。但在实例化时没有使用,那么默认类型是Object类型
Order<Boolean> order=new Order<>();
order.setT(true);
order.add();
System.out.println(order.getT());
List<Boolean> list=order.list;
System.out.println(list);
System.out.println();
SubOrder o=new SubOrder();
List<Integer> list1=o.list;
System.out.println(list1);
System.out.println();
//当通过对象调用泛型方法时,指明泛型方法的类型
Integer i=order.getE(34);
Double d=order.getE(2.3);
String a=order.getE(new String("kobr"));
System.out.println(a);
System.out.println();
Integer[] in=new Integer[]{1,2,3};
//List<Integer> llist=new ArrayList<>();
List<Integer> list3=order.fromArrayToList(in, new ArrayList<Integer>());
System.out.println(list3);
}
//泛型与继承的关系
//若类A是类B的子类,那么List<A>就不是List<B>的子接口
@Test
public void test5(){
Object obj=null;
String str="AA";
obj=str;//可以赋值。说明String是Object的一个子类
Object[] obj1=null;
String[] str1=new String[]{"AA","BB","CC"};
obj1=str1;//
List<Object> list1=null;
List<String> list2=new ArrayList<String>();
//list1=list2;//错误:不能从 List<String> 转换为 List<Object>
//假设list1=list2;满足,list和list1指向同一个内存
//list.add(123);
//String str=list2.get(0);//出现问题,所以假设不满足
}
/*
* 通配符:?
* List<A>,List<B>...都是List<?>的子类
*
* ? extends A:可以存放A及其子类
* ? super A:可以存放A及其父类
*/
@Test
public void test6(){
List<?> list=null;
List<Object> list1=new ArrayList<>();
List<String> list2=new ArrayList<>();
list=list1;
list=list2;
show(list1);
//show(list2);//不可以放
show1(list1);
show1(list2);
List<? extends Number> list3=null;
List<Integer>list4=null;
list3=list4;
//list3=list1;//错误,list1的Object是Number的父类
List<? super Number> list5=null;
list5=list1;//可以
}
/*
* 通配符的使用
*/
@Test
public void test7(){
List<String> list=new ArrayList<>();
list.add("AA");
list.add("BB");
List<?> list1=list;
//可以读取声明为通配符的集合类的对象
Iterator<?> it=list1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//不允许向声明为通配符的集合类中写入对象,唯一例外的是null
//list1.add("CC");//错误
list1.add(null);//null可以存
}
public void show(Collection<Object> coll)//只有Object的可以放
{}
public void show1(Collection<?> coll)//都可以放
{}
}
//自定义泛型类
class Order<T>{
private String orderName;
private int orderId;
private T t;
List<T> list =new ArrayList<>();
public void add(){
list.add(t);
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
@Override
public String toString() {
return "Order [orderName=" + orderName + ", orderId=" + orderId + ", t=" + t + "]";
}
//声明泛型方法
public <E> E getE(E e){
return e;
}
//实现数组到集合的复制
public <E> List<E> fromArrayToList(E[] e,List<E> list){
for(E e1:e)
{
list.add(e1);
}
return list;
}
}
//继承泛型类或泛型接口时,可以指明泛型的类型(常用在数据库各种不同的表的处理)
class SubOrder extends Order<Integer>{
}