可以接受所有的泛型类型,但不能让用户随意更改。该特性从JDK1.5之后出现。有以下三种常见的通配符:
1. ?
- 使用:该通配符用于方法中,可以接收任意类型,但不能修改类型,因为参数类型不确定。
- 声明方式:
public void fun(Massage<?> massage){}
- 举例:
class Massage<T>{
private T x;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
}
public class Test{
public static void main(String[] args) {
Massage<Integer> massage = new Massage();
massage.setX(55);
print(massage);
}
public static void print(Massage<?> massage){
//不能对值进行修改
//massage.setX(20);
System.out.println(massage.getX());
}
}
- 运行结果:
2. ? extends 类
- 使用:设置和取得泛型的上限
- 声明:
? extends Number;//表示泛型类型只能是Number类或其子类
- 注:
1.用在类上:
T extends 类 //表示T必须为类或者类的子类
2.用在方法上:
? extends 类 //表示只能接受类或类的子类的泛型类
只能取得类中属性值,不能修改值--由于父类到子类要发生向下转型,但不知道具体子类,因此无法转型
- 举例:
class Massage<T extends Number>{//设置泛型上限
private T x;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
}
public class Test{
public static void print(Massage<? extends Number> massage){
//不能设置属性值
//massage.setX(99);
System.out.println(massage.getX());
}
public static void main(String[] args) {
Massage<Integer> massage = new Massage<>();
massage.setX(55);
print(massage);
}
}
- 运行结果:
3. ? super 类
- 使用:取得泛型的下限--只能用在方法中
- 声明:
? super String;//表示此方法只能取得String或其父类
- 注:可以设置属性值--子类到父类是自动的向上转型
- 举例:
class Massage<T>{
private T x;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
}
public class Test{
public static void main(String[] args) {
Massage<String> massage = new Massage<>();
massage.setX("hello world");
print(massage);
}
public static void print(Massage<? super String> massage){
//可以设置属性值
massage.setX("haha");
System.out.println(massage.getX());
}
}
- 运行结果: