Java基础-泛型
一、泛型是什么
泛型的本质是参数化类型
定义:泛型提供了编译时类型安全检测机制,泛型的本质是参数化类型:给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。
二、为什么使用泛型
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
- 保证编译期类型的安全性
- 消除强制转换,避免了强制类型转换运行时异常
- 同一个类可以操作多种类型数据,代码复用
- 避免了不必要的装箱、拆箱操作,提高程序的性能
2.1 java 中泛型标记符(泛型参数):
T、E、R、K、V 对于程序运行时没有区别,只是名字不同
? :表示不确定的泛型类型
T :(type) 表示具体的一个泛型类型(任意类型 type)
K V :(key-value) 分别代表 Map 中的键值 Key Value
E :集合中元素的类型 element,例如 ArrayList 中的元素
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
2.2泛型类、泛型接口、泛型方法。
这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
2.2.1 泛型类:
注意:泛型类型必须是引用类型(非基本数据类型)
定义泛型类,在类名后添加一对尖括号,并在尖括号中填写类型参数,参数可以有多个,多个参数使用逗号分隔:
泛型类:把泛型定义在类上
public class Generic<T> { // T:任意类型 type
private T value;
public Generic(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
@Override
public String toString() {
return "Generic{" +
"value=" + value +
'}';
}
}
测试:
public static void main(String[] args) {
Generic<String> stringGeneric = new Generic<>("T (type) 表示具体的一个泛型类型");
Generic<Integer> integerGeneric = new Generic<>(666);// int类型
Generic<Boolean> booleanGeneric = new Generic<>(true);// Boolean类型
// 打印结果
System.out.println(stringGeneric);
System.out.println(integerGeneric);
System.out.println(booleanGeneric);
}
2.2.2 泛型接口:
接口:
public interface GenericInterface<T> {
void work(T value);
}
实现类:给类型指定一个参数化类型(尖括号内)
public class StringImpl implements GenericInterface<String>{
@Override
public void work(String value) {
System.out.println(value);
}
}
public class IntImpl implements GenericInterface<Integer>{
@Override
public void work(Integer value) {
System.out.println(value);
}
}
测试类:
public static void main(String[] args) {
StringImpl string = new StringImpl();
string.work("实现泛型接口");
IntImpl anInt = new IntImpl();
anInt.work(123);
}
2.2.3 泛型方法
泛型方法,是在调用方法的时候指明泛型的具体类型 。
泛型方法:
public class GenericMethod {
public <T> String commonMethod(int id,T name,T age){
String res=id+"\t"+name+"\t"+age;
System.out.println(res);
return res;
}
测试类:
public static void main(String[] args) {
GenericMethod genericMethod = new GenericMethod();
genericMethod.commonMethod(001,"张三",12);
}
三:泛型边界通配符
<?> 无边界通配符
<? extend E> 上边界通配符:接受指定类及其子类类型的数据。
<? supper E> 下边界通配符:接受指定类及其父类类型的数据.。
注意: 你可以为一个泛型指定上边界或下边界, 但是不能同时指定上下边界。