Java泛型中类型限定<T extends 数据类型>和 通配符<? extentds 数据类型>的区别

时间:2025-04-20 13:08:29

”T“ 是一个形参,表示所有String类的派生类其中的 ”某一个类”,当使用的时候会被强转成传入的具体类型,而”?“是一个实参,表示所有String类的派生类的集合,可以理解为一个范围。比如:

class Fruit{
    public void getName(){
        print("Fruit")
    }
}
class Apple extends Fruit{
    @override
    public void getName(){
        print("Apple")
    }
}
class Generic<T extend Fruit>{
    T data;
    public void getFruitName(T t){
        t.getName()
    }
    public void setData(T t){
        data = t;
    }
    public T getData(){
        return data;
    }
}
public void setGeneric(Generic<? extends Fruit> generic){
    
}

<T extend Fruit>限定了泛型的上边界为Fruit,所以new Generic<Fruit>或着new Generic<Apple>都是可以的,可以通过()调用Fruit及其派生类的getName方法。

而在setGeneric()方法只要传入的Generic类的泛型是Fruit类及其子类就可以,但是无法通过?.getName()方法调用Fruit及其子类的方法。