欢迎光临散文网 会员登陆 & 注册

java泛型通配符的用法

2022-07-16 10:08 作者:虚云幻仙  | 我要投稿

/**
* 泛型中通配符的使用 无界通配符? 通配符的上限限定和下限限定
*/

public class Test7<T> {
   private T value;
   public Test7(T v){
       this.value = v;
   }
   public void printValue(){
       System.out.println(value);
   }
   //定义一个泛型类 通过类的T设定了value的类型
   public static void main(String[] args) {
       Test7<Integer> i7 = new Test7<>(7);
       i7.printValue();
       //调用类内定义好的方法使用 T value
   }
}

class ShowValue{
//    public void printValue(Test7 t){
//        //当在外部调用Test7时需要设定具体的类型 如果不设定会默认为Object
//    }
//    public void printValue(Test7<Integer> t){
//        //如果设定为Integer 当需要调用Test7<String>等其他类型的对象时会无法使用该方法
//    }

   public void printValue(Test7<?> t){
       //通过无界通配符? 来代表任意类型的Test7<> 无论什么类型都可以调用这个方法
       t.printValue();
   }

   public static void main(String[] args) {
       Test7<Integer> i7 = new Test7<>(7);
       Test7<String> s7 = new Test7<>("7");
       ShowValue s = new ShowValue();
       s.printValue(i7);
       s.printValue(s7);
       //i7和s7都符合Test7<?>
       Test7<?> t7 = i7;
       //引用变量也可以用<?>
       Test7<?> o8 = new Test7<>("");
//        Test7<Integer> i8 = t7;  报错 需要强转
   }
}

class ShowValue2{
   public void printValue(Test7<? extends Number> t){
       //可以对通配符的适用范围进行限定
       //格式  <通配符 extends 类名/接口名>
       //将继承树中的上限设定为Number 所有Number的子类包括Number都可以使用该方法 其他与Number无关的类无法调用

       t.printValue();
   }

   public static void main(String[] args) {
       Test7<Object> o7 = new Test7<>(new Object());
       ShowValue2 s2 = new ShowValue2();
//        s2.printValue(o7);报错 在继承树中Object在Number的上面 超过了通配符的上限
       Test7<String> s7 = new Test7<>("");
//        s2.printValue(s7);报错 String不是Number的子类 无法调用方法
   }
}

class Test8<T extends String>{
   //定义泛型类/泛型接口和泛型方法时也可以通过extends限定适用范围
   <T extends Number> void a(){}
}

class Test9{
   public void a(Test7<? super Integer> i){}
   //super用来限定通配符的下限 在继承树中Integer及Integer的父类可以使用该方法
   Test7<? super Integer> flag;
   //给属性设定下限 super和extends用法一样 但super只能用于?通配符
}
//class Test10<?> {} 报错 ?不能用在泛型类上 所以super也不能用在泛型类上
//泛型不能同时定义上限和下限

java泛型通配符的用法的评论 (共 条)

分享到微博请遵守国家法律