1、泛型介绍
泛型是一种未知的数据类型,不确定数据类型的时候使用泛型。
泛型也可以看做一个变量,用来接收数据类型;
创建对象时确定泛型的数据类型
举例:
ArrayList在定义的时候,不知道会存储什么类型的数据,所以类型使用泛型;
创建集合对象的时候,就会确定泛型的数据类型,数据类型作为参数传递。
创建集合时不使用泛型
可能抛出类型转换异常
泛型的作用
- 避免类型转换异常
- 把运行期异常提升到编译期
编译期异常是Exception throw ;编译器异常程序必须处理:通过throws 或者 try catch
运行期异常 RuntimeException 运行期异常程序不是必须处理
2、泛型的使用
2.1 定义泛型的类:
泛型可以接受任意数据类型
泛型在创建对象的时候确定
/*
泛型是一种未知的数据类型,不确定数据类型的时候使用泛型。
泛型也可以看做一个变量,用来接收数据类型;
创建对象时确定泛型的数据类型
*/
public class GenericClassTest {
public static void main(String[] args) {
// 创建对象时确定数据类型
GenericClass<Integer> genericClass = new GenericClass<>();
}
}
class GenericClass<E> {
private E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
2.2 含有泛型的方法:
在调用方法时确定泛型的数据类型
public void get(M m);
public static void get(M m); 静态方法不建议创建对象使用
/* 定义含有泛型的方法:泛型定义在方法的修饰符和返回值类型之间
* 格式:
* 修饰符<泛型> 返回值类型 方法名(参数列表(使用泛型))
* 含有泛型的方法,在调用方法时确定泛型的数据类型
* 传递参数时确定泛型的类型
*/
public class GenericMethod {
public static void main(String[] args) {
GenericMethod genericMethod = new GenericMethod();
genericMethod.method("343434");
genericMethod.method(56.78);
}
public <R> void method (R r) {
System.out.println(r);
}
}
2.3 含有泛型的接口:<>
1、接口的实现类指定泛型类型
接口方法可以使用泛型类型 :迭代器
/*泛型接口*/
public interface GenericInterface<E> {
public abstract void method(E e);
}
// 实现接口要重写所有方法
class GenericInterfaceImpl implements GenericInterface<String>{
@Override
public void method(String e) {
System.out.println(e);
}
}
2、接口指定泛型类型,实现类不指定
创建实现类对象时指定泛型类型 :ArrayList
/*泛型接口*/
public interface GenericInterface<E> {
public abstract void method(E e);
}
// 实现接口要重写所有方法
class GenericInterfaceImpl<E> implements GenericInterface<E>{
@Override
public void method(E e) {
System.out.println(e);
}
}
2.4 泛型通配符
1、?表示任意数据类型
定义时不可用,参数可用
2、泛型的上限和下限
上限 ?extends E E的子类
下限 ?super E E的父类
注意,参数可以用通配符,定义变量不可用