一:通配符
因为泛型是初始化的时候才确定数据的类型,而接受这个对象或对象的这个属性的方法确是固定的,所以需要对传入这个方法的这些个属性的类型进行判断和限制,不然,一个只能出来Integer类型的方法如果传入了String类型,这个方法执行的过程中就会出现错误。如果这个方法可以处理任何类型的数据,就可以使用通配符“ ?”来进行接收。
范例1:
package haizhu.com;
class Student<T>{
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
public class GenericDemo01 {
public static void function(Student<?> s){ //使用“ ?”表示这个方法可以接收T对应的属性可以是任何数据类型
System.out.println("姓名是:"+s.getName());
}
public static void main(String[] args) {
Student<String> s = new Student<String>();
s.setName("Haizhu");
function(s);
}
}
二:泛型上限和下限
但是一般的时候,有些方法只能处理一部分数据类型,这时候就可以使用上限和下限来确定这个范围,格式如下:
泛型上限:
<? extends 类>
范例2:
public static void function(Student<? extends Number> s){
System.out.println("姓名是:"+s.getName());
}
表示只能接收Number这个类以及这个类的子类的数据类型。(extends表继承,就是这个类下面的东西)
泛型下限:
<? super 类>
范例3:
public static void function(Student<? super Number> s){
System.out.println("姓名是:"+s.getName());
}
表示只能接收Number这个类以及这个类的父类的数据类型。(super表父类,超过这个类的东西)