目录
一、概念
泛型在java中有很重要的地位,并且编程中也是非常常见的,在面向对象编程及各种设计模式中有非常广泛的应用。
泛型就是变量类型的参数化。也就是说,所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别称为泛型类、泛型接口和泛型方法。
泛型在集合中的使用
//创建集合并指定泛型,约束集合只能存储String类型的数据
List<String> list = new ArrayList<String>();//集合只能添加字符串类型的数据
list.add("AA");
list.add("true");
list.add("100");
//....//获取集合中的元素,直接使用泛型类型接收数据即可,不需要强制类型转换
String str1 = list.get(0) ;
String str2 = list.get(1) ;
String str3 = list.get(2) ;System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
不使用泛型
//创建集合,但并没有指定泛型
List list = new ArrayList();//集合可以添加任意类型的数据
list.add("AA");
list.add(true);
list.add(100);
//....//获取集合中的元素,默认为Object类型,强制转换为相应的数据类型
String str1 = (String)list.get(0) ;
Boolean str2 = (Boolean)list.get(1) ;
Integer str3 = (Integer)list.get(2) ;System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
二、好处
1、类型安全
指定具体类型后,Java编译器会对错误的类型在编译时被捕获,而不是在运行时当作ClassCastException展示出来。从而提高程序的安全性和可靠性。
List<String> list = new ArrayList<String>() ;
list对象只能存放String对象,否则会编译出错
2、消除强制类型转换
//需要强制类型转换
List list = new ArrayList() ;
String str = (String)list.get(0) ;
//不需要类型转换
List<String> list = new ArrayList<String>() ;
String str = list.get(0)
三、分类
1、泛型类
1)语法
[访问修饰符] class 类名<泛型1,泛型2,...> { 泛型1 泛型成员1 ; 泛型2 泛型成员2; ... }
例子
//定义一个泛型
public class People<A> {
private String name;
private String sex;
private A pet;
}
//定义多个泛型
public class People<A,B> {
private String name;
private String sex;
private A pet;
private B phone ;
}
2、泛型接口
1)语法
[访问修饰符] interface 接口名<泛型1,泛型2,...> {
泛型1 泛型成员1 ;
泛型2 泛型成员2 ;
...
}
案例演示:
/**
* 第一:定义泛型接口
*/
public interface GenericTest<T> {
// 1. 常量
public static final String name = "AAA";
// 2.抽象方法
public void sayHello(T sth);
}
/**
* 第二:实现接口
* 当实现泛型接口时,必须指定具体的数据类型
*/
public class GenericTestIntegerImpl implements GenericTest<Integer> {
@Override
public void sayHello(Integer sth) {
System.out.println("你好,"+sth);
}
}
/**
* 第二:实现接口
* 当实现泛型接口时,必须指定具体的数据类型
*/
public class GenericTestStringImpl implements GenericTest<String> {
@Override
public void sayHello(String sth) {
System.out.println("你好,"+sth);
}
}
/**
* 测试
* 第三:使用泛型接口
*/
public class MainTest {
public static void main(String[] args) {
GenericTest<Integer> gt1 = new GenericTestIntegerImpl() ;
gt1.sayHello(100) ;
GenericTest<String> gt2 = new GenericTestStringImpl() ;
gt2.sayHello("张三") ;
}
}
3、泛型数组
/**
* 第一:定义泛型类,使用泛型定义数组
*/
public class GenericTest<T> {
T[] arr;
public T[] getArr() {
return arr;
}
public void setArr(T[] arr) {
this.arr = arr;
}
}
/**
* 第二:定义泛型类对象,调用方法,传递数组
*/
public static void main(String[] args) {
GenericTest<String> gt = new GenericTest<String>() ;
String[] str = {"aa","bb","cc"} ;
gt.setArr(str) ;
String[] arrs = gt.getArr() ;
for (String s : arrs) {
System.out.println(s);
}
}