泛型 (重要)

/**
* 泛型的使用:
* 1.Jdk5.0出现的一个新特性
* 2.可以有效避免强制类型转换引发的异常
* 3.限制集合的数据类型,提高了数据类型的安全性
* 4.讲运行时异常转成了编译时异常
* 二、在集合中使用泛型
* 1.集合接口和集合实现类在jdk5.0的时候都改成了泛型结构
* 2.在实例化集合的时候,我可以指定具体的泛型类型
* 3.如果在实例化集合的时候,没有指定泛型类型,默认类型就是Object类型
* 4.指明完成以后,在集合接口或集合类里面,内部结构(属性、方法)使用此类泛型的位置,
* 都指定为了实例化的泛型类型:
* List<Integer> list=new .. boolean add(E e);变成了boolean add(Integer e);
* 注意:泛型的类型必须是类,不能是基本数据类型,如果要使用基本数据类型的话,
* 使用基本数据类型对应的包装类,因为集合里面保存的都是对象
*
* 常用的几个字母
* ?: 表示不确定java类型
* T(type):表示一个java类型
* K(key):map中的键 key
* V(value):map中的值value
* E(element):代表一个element
*
* 三、什么时候使用泛型?
* 1.当操作引用类型不确定的时候可以使用泛型
* 2.<>就是一个用于接收具体类型的代表
*
* 四、泛型类
* 1.定义泛型类:在类名后面通过<>指定一个或多个类型参数,如果多个的话
* 需要通过,隔开 class Person<K,V>
* 2.如果自定的泛型类在实例化对象的时候没有指定泛型类型,默认就是object
* 3.如果在实例化对象的时候指定了泛型类型,指定后对应类后面使用的泛型位置就是已确定为实例化中指定的类型
*
* 五、泛型方法
* 1.在定义泛型方法的时候,需要在方法的访问修饰符后面通过<>指定泛型方法的类型
* 2.泛型方法的定义和所在类是不是泛型没有任何关系
*
* 六、泛型接口(三层架构):dao层:数据库访问层(操作数据库,对数据库数据进行增删改查)
*
* 七、通配符的使用
*
*/

 

public class TestGeneric {
//如果集合没有使用泛型,可能会出现的问题
@Test
public void test(){
//期末考试成绩出来了,把考试成绩保存到list集合里面,
//取出每一位学生的成绩
List list=new ArrayList();
list.add(90);
list.add(80);
list.add(60);

 

//没有规定这个集合只能添加什么类型的数据,Object,什么类型的数据我都可以网这个集合里面去添加
list.add("abc");

 

for(int i=0;i<list.size();i++){
//取出每位学生的成绩
//在强制转换成int的时候,会出现异常
int socre=(int)list.get(i);
System.out.println("成绩为:"+socre);
}

 

}

 

@Test
public void test1(){
//使用泛型的集合
//期末考试成绩出来了,把考试成绩保存到list集合里面,
//取出每一位学生的成绩
//泛型只能指定是引用数据类型,因为集合保存的都是对象
List<Integer> list=new ArrayList<Integer>();//这个集合只能保存Integer的数据
list.add(90);
list.add(80);
list.add(60);
list.add(29);
// list.add("abc");

 

for(int i=0;i<list.size();i++){
//取出每位学生的成绩
int socre=(int)list.get(i);
System.out.println("成绩为:"+socre);
}
}

 

//map泛型
@Test
public void test2(){
Map<String,String> map=new HashMap<String,String>();
map.put("1001","鲁班");
map.put("1002","孙尚香");
map.put("1003","百里守约");

 

//遍历map
Set<Map.Entry<String,String>> set= map.entrySet();
for (Map.Entry<String,String> entry:set){
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"-"+value);
}
}

 

@Test
public void test3(){
//创建一个泛型类
Person<String,String> p=new Person<>();
//设置成员变量的值
p.setT("博文");
//调用get方法
System.out.println(p.getT());
//调用方法
p.eat();

 

//没有使用泛型创建类
Person p1=new Person();
p1.setT(111);

 

Student stu=new Student();
stu.eat();

 


Student1<String,Integer> student1=new Student1();

 

//泛型方法
Integer[] integers=new Integer[]{1,2,4};
List<Integer> list=new ArrayList<>();
List<Integer> list1=p.copyArrayToList(integers,list);
System.out.println(list1);

 

//使用泛型方法的好处?

 

//泛型接口的使用
UserDaoImpl user=new UserDaoImpl();
List<User> list2=user.getList();
for(User user1:list2){
System.out.println(user1);
}
}

 

/**
* 泛型在继承方面:了解
* 虽然A是B的父类,但是E<A>和E<B>两者没有父子关系
* 我们可以找一个通用的父类
* 通配符?
* 不知道用什么类型来接受的时候,可以用?标识
*/
@Test
public void test4(){
Object obj=null;
String str=null;
obj=str;//可以,因为obj是父类,str是子类
//父子关系
Object[] arr1=null;
String[] arr2=null;
arr1=arr2;//可以

 

System.out.println(arr2[0]);

 

//此时lis1和list2类型没有任何关系,没有父子关系
//泛型之间是没有继承关系的
List<Object> list1=new ArrayList<>();
List<String> list2=new ArrayList<>();
List<Person> list3=new ArrayList<>();
// list1=list2;
// list1.add(123);

 

List<?> list=null;//他就变成了一个通用的父类
list=list1;
list=list2;

 


// list1.add(123);//混入了非String的数据
// Date date=new Date();
// str=date;
show(arr2);
show1(list1);
//show1(list2);

 

show3(list1);
show3(list2);

 


}

 

public void show(Object[] o){
}
//遍历集合
public void show1(List<Object> list){

 

}
public void show2(List<String> list){

 

}

 

public void show3(List<?> list){//提高通用性
}

 

}

 

posted @ 2021-04-17 10:13  F11  阅读(71)  评论(0)    收藏  举报