可以接受所有的泛型类型,但不能让用户随意更改。该特性从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());
    }
}
  • 运行结果:

字符串通配符java 通配符 java_泛型

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);
    }
}
  • 运行结果:

字符串通配符java 通配符 java_泛型_02

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());
    }
}
  • 运行结果:

字符串通配符java 通配符 java_子类_03