泛型(Generic)
泛型就是参数化类型,把类型作为可传递参数
常见形式有:泛型类、泛型接口、泛型方法
语法:类名<T>
(可以写多个,中间用逗号隔开)
有以下几种常用泛型类型变量
- E:元素(Element)
- K:关键字(Key)
- N:数字(Number)
- T:类型(Type)
- V:值(Value)
好处:
- 提高代码的重用性
- 防止类型转换异常,提高代码的安全性
泛型类
public class Generic<T> {
T t;
//使用泛型作为形参
public void myGeneric(T t){
System.out.println(t);
}
//使用泛型作为返回值
public T getT() {
return t;
}
@Test
public void Test(){
Generic<String> generic=new Generic();
generic.myGeneric("Hello Generic");
generic.t="我是全局变量";
System.out.println(generic.getT());
}
//输出结果
//Hello Generic
//我是全局变量
}
个人感觉实际作用就是为了限制参数类型,保证参数类型都一致
在实例化的时候,Generic<String> generic=new Generic();
你给泛型限制的什么类型;
后面的方法或者变量都按照这个类型传递;
除非再实例一个对象传递不同的类型。
(注意)泛型只允许使用引用类型
泛型接口
接口
public interface MyInterface<T> {
void show(T t);
}
实现类
实现的时候不指定接口的泛型类型(将实现类变成泛型类)
public class MyInterfaceImpl<T> implements MyInterface<T>{
public void show(T t) {
System.out.println(t);
}
@Test
public void Test(){
MyInterface myInterface=new MyInterfaceImpl<String>();
myInterface.show("通过泛型类来先不指明是什么类型");
}
}
实现的时候指定泛型类型
public class MyInterfaceImpl implements MyInterface<String>{
public void show(String t) {
System.out.println(t);
}
@Test
public void Test(){
MyInterface myInterface=new MyInterfaceImpl();
myInterface.show("直接指定泛型类型");
}
}
泛型方法
从这里可以很明显的体现出代码重用性,实现了类似重载的功能、代码量也减少了。
public class GenericMethod {
public <T> T show(T t){
System.out.println(t);
return t;
}
@Test
public void Test(){
GenericMethod genericMethod =new GenericMethod();
genericMethod.show("我输入的是什么类型的值,这个泛型就是什么类型");
genericMethod.show(100);
genericMethod.show(3.14);
}
}
泛型集合
参数化类型、类型安全的集合,强制要求集合元素的类型一致。
特点:
- 编译时即可检查,而非运行时抛出异常
- 访问时不必类型转换(拆装箱)
- 不同类型的泛型之间不能相互赋值,泛型不存在多态
不使用泛型集合,添加不同类型的元素遍历的时候进行类型转换会发生异常
public void Test(){
ArrayList arrayList=new ArrayList();
arrayList.add(10);
arrayList.add("张三");
//使用循环遍历想进行类型转换的时候,会发生转换异常
for (Object o : arrayList) {
System.out.println((String) o);
}
}
使用泛型集合则在你添加不同类型元素的时候会直接报红
public void Test(){
ArrayList<String> list =new ArrayList<String>();
list.add("张三");
list.add("李四");
//如果添加的元素类型不一样,会直接报红
//list.add(100);
}