认识泛型
12.1.什么是泛型?
泛型—广泛的数据类型。
将某一个类/接口/方法/变量的数据类型象使用参数一样传递给类/接口/方法/变量。
数据类型的参数化,任意化
12.2.为什么需要泛型?
第一天 类中的x,y变量需要int
package com.wangxing.test1;
public class IntTest {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
第二天 类中的x,y变量需要double ,我们创建一个新类修改了一下x,y变量数据类型
package com.wangxing.test1;
public class DoubleTest {
private double x;
private double y;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
第三天 类中的x,y变量需要String ,我们创建一个新类修改了一下x,y变量数据类型
第四天 类中的x,y变量需要char ,我们创建一个新类修改了一下x,y变量数据类型
…
当我们需要很多个业务逻辑相似,但是数据类型不同的java类时,我们又不想创建出多个业务逻辑相似,但是数据类型不同的java类。
我们就会想能不能用一个类把业务逻辑相似,但是数据类型不同的多个java类,统一一下
要解决这个统一问题我们就会首先处理数据类型的统一,要处理数据类型的统一,我们就会想到java.lang.Object类。
package com.wangxing.test1;
public class ObjectTest {
private Object x;
private Object y;
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
public Object getY() {
return y;
}
public void setY(Object y) {
this.y = y;
}
}
测试:
package com.wangxing.test1;
public class testmain {
public static void main(String[] args) {
ObjectTest ot=new ObjectTest();
// ot.setX("hello");
// ot.setY("world");
//改成int
ot.setX(120);
ot.setY(110);
System.out.println("x=="+ot.getX()+",y=="+ot.getY());
}
}
虽然我们可以使用Object来统一数据类型,但是在使用的时候需要进行强制类型转换,如果转换不当会出现类型转换异常 java.lang.ClassCastException。
这是我们需要处理的是在具体操作使用的过程中能不能不进行强制类型转换,避免类型转换异常 java.lang.ClassCastException发生。
这时我们就会想我们能不能把数据类型,象参数一样传递给我们需要使用的java类,这要我们既可以统一类型,可以避免强制类型转换。
这式泛型就被研究出来,解决上面的问题。
12.3.如何创建一个泛型类/泛型接口?
package com.wangxing.test2;
public class FanXingLei<T> {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
在创建类的时候为类名后面添加一个“<>”,给”<>”中添加单个的大写字母,用来接收具体的某个数据类型。
”<>”中的单个的大写字母可以出现多个,中间使用”,”分割。
类中需要数据类型的部分可以使用单个的大写字母来代替,这是我们我们创建类的时候就可以传递具体的数据类型给单个的大写字母,类中需要数据类型的部分全部都会变成我们传递具体的数据类型。
12.4.泛型类/泛型接口如何使用?
使用泛型类:
- 使用泛型类创建对象的时候需要传递具体的数据类型。
例如:FanXingLei fanx1=new FanXingLei();
FanXingLei fanx2=new FanXingLei(); - 基本数据类型在被作为泛型的数据类型时,是不被允许的,可以使用应基本类型对应的封装类型代替
例如:FanXingLei fanx3=new FanXingLei(); //错误的
FanXingLei fanx4=new FanXingLei(); - 当我们创建泛型对象的时候,没有传递指定的数据类型默认是Object类型。并伴随有警告信息出现。
例如:FanXingLei fanx5=new FanXingLei();
fanx5.setX(Object);
package com.wangxing.test2;
public class TestMain1 {
public static void main(String[] args) {
FanXingLei<Integer> fanxing=new FanXingLei<Integer>();
fanxing.setX(12);
fanxing.setY(21);
System.out.println("x=="+fanxing.getX()+",y=="+fanxing.getY());
//改String
FanXingLei<String> fanxing2=new FanXingLei<String>();
fanxing2.setX("hello");
fanxing2.setY("hello");
System.out.println("x=="+fanxing2.getX()+",y=="+fanxing2.getY());
//基本数据类型不允许被作为泛型的数据类型,可以使用适应基本数据类型对应的封装类型
//比如double作为泛型数据类型
// FanXingLei<double> fanxing3=new FanXingLei<double>();报错
//没有定义泛型的数据类型就会默认为Object
FanXingLei fanxing4=new FanXingLei();
// fanxing4.setX(Object);
}
}
之前学习过的类,他们其实是泛型类
java.util Class ArrayList
ArrayList(Collection<? extends E> c)
java.util Class HashMap<K,V>
java.util Class Hashtable<K,V>
之前学习过的接口,他其实是泛型接口
java.util Interface Map<K,V>
public interface List
public interface Collection
例如:
package com.wangxing.test3;
public class StudentBean {
private int stuid;
private String stuname;
private int stuage;
private String stuaddress;
//构造方法
public StudentBean() {
}
public StudentBean(int stuid,String stuname,int stuage,String stuaddress) {
this.stuid=stuid;
this.stuname=stuname;
this.stuage=stuage;
this.stuaddress=stuaddress;
}
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
public String getStuaddress() {
return stuaddress;
}
public void setStuaddress(String stuaddress) {
this.stuaddress = stuaddress;
}
}
测试类:
package com.wangxing.test3;
import java.util.ArrayList;
public class TestMain1 {
public static void main(String[] args) {
//没有定义泛型数据类型
//对象
// StudentBean stu1=new StudentBean(1001,"zhangsan",23,"西安");
// StudentBean stu2=new StudentBean(1002,"lisi",24,"北京");
// StudentBean stu3=new StudentBean(1003,"wangwu",25,"上海");
// //集合
// ArrayList arraylist=new ArrayList();
// arraylist.add(stu1);
// arraylist.add(stu2);
// arraylist.add(stu3);
// for(Object obj:arraylist){
// StudentBean sd=(StudentBean)obj;
// System.out.println("id=="+sd.getStuid()+",name=="+sd.getStuname()+",age=="+sd.getStuage()+"address=="+sd.getStuaddress());
// }
//定义泛型数据类型
StudentBean stu1=new StudentBean(1001,"zhangsan",23,"西安");
StudentBean stu2=new StudentBean(1002,"lisi",24,"北京");
StudentBean stu3=new StudentBean(1003,"wangwu",25,"上海");
//集合
ArrayList<StudentBean>arraylist=new ArrayList<StudentBean>();
arraylist.add(stu1);
arraylist.add(stu2);
arraylist.add(stu3);
//不需要强转
for(StudentBean obj:arraylist){
StudentBean sd=obj;
System.out.println("id=="+sd.getStuid()+",name=="+sd.getStuname()+",age=="+sd.getStuage()+"address=="+sd.getStuaddress());
}
}
}