”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及其子类的方法。