JAVA学习3 泛型
很难想象人活得到底是为了什么,宫室之美,妻妾之奉,所识穷乏者得我与?
泛型
我们操作JAVA存储数据的时候不可避免的要处理数据类型,而泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查,这样可以避免强制类型转换,及其可能出现的异常。
public class ArrayList<T> {
}
泛型类
泛型类是指在定义类时使用类型参数的类。通过在类名后添加尖括号 <> 并指定类型参数(如 T),可以在类中使用该类型参数来表示变量、方法参数或返回值的类型。
public class Container<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
泛型接口
泛型接口是指在定义接口时使用类型参数的接口。与泛型类类似,泛型接口通过在接口名后添加类型参数来实现。
public interface Generic<T> {
void show(T t);
}
//实现这个接口时,可以指定具体类型,也可以不指定从而使得其更加灵活处理不同类型对象
public class GenericImpl<T> implements Generic<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
泛型方法
允许在方法定义时使用类型参数,从而使得方法能够处理多种数据类型,而无需为每种类型编写专门的代码
public <T> void methodName(T parameter) {
// 方法体
}
通配符与上下限
?表示通配符,传递时接受一切类型
? extends Node表示上限,可以接受的必须是Node及其子类
? super Node表示下限,可以接受的必须是Node及其父类
public class Node {
}
class Son1 extends Node {
}
class Son2 extends Node {
}
//这样处理是错误的,虽然Son1和Son2是Node的子类,但是ArrayList<>情况下则没有任何关系
public void calc(ArrayList<Node> list) {
}
ArrayList<Son1> son1list = new ArrayList()<>;
ArrayList<Son2> son2list = new ArrayList()<>;
calc(son1list);
calc(son2list);
//接下来两种情况的处理才是正确的
public void calc(ArrayList<?> list) {
}
ArrayList<Son1> son1list = new ArrayList()<>;
ArrayList<Son2> son2list = new ArrayList()<>;
calc(son1list);
calc(son2list);
//
public void calc(ArrayList<? extends Node> list) {
}
ArrayList<Son1> son1list = new ArrayList()<>;
ArrayList<Son2> son2list = new ArrayList()<>;
calc(son1list);
calc(son2list);
包装类
JAVA中泛型不支持基本数据类型,而是支持引用数据类型,也就是包装类,后者本质是对象类型
ArrayList<int> list = new ArrayList<>(); //错误的用法,int是基本数据类型
ArrayList<Integer> list = new ArrayList<>(); //正确,Integer是引用数据类型

浙公网安备 33010602011771号