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是引用数据类型
posted @ 2026-03-10 19:58  tcswuzb  阅读(4)  评论(0)    收藏  举报