JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)

  一.通配符上限和通配符下限接受的类型

  通配符上限:<? extends T>

  通配符下限:<? super T>

  以下代码是测试结果,注释为解释说明

 1 package xayd.hjj;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 class A{}
 7 class B extends A implements F{}
 8 class C extends A{}
 9 class D extends A{}
10 class E{}
11 interface F{}
12
13 public class Test{
14
15     public static void main(String[] args) {
16
17         //下面五行代码说明:List<? extends A>接受A或者继承A的类
18         List<? extends A> listA = new ArrayList<A>();
19         List<? extends A> listB = new ArrayList<B>();
20         List<? extends A> listC = new ArrayList<C>();
21         List<? extends A> listD = new ArrayList<D>();
22         // List<? extends A> listE = new ArrayList<E>();  //编译不能通过,类E与类A无关
23
24
25         //下面三行代码说明:List<? super B>接受B或者的父类
26         List<? super B> listA1 = new ArrayList<A>();       List<? super B> listA2 = new ArrayList<B>();
27         List<? super B> listF = new ArrayList<F>();
28         //List<? super B> listC1 = new ArrayList<C>();  //编译不能通过,类C不是类B的父类
29
30     }
31 }

 

   二.通配符下限和通配符上限存取问题

   通配符上限:<? extends A>

   List<? extends A> list = new ArrayList<B>();

   这样定义一个list的时候,是不允许向这个list添加任何东西的。list可以接受其B类型和B的子类。像list中添加对象的时候因为编译器不能确定这个子类的确切类型,因此不允许向里添加任何对象。唯一可以添加的是null。也可以这样理解:Fruit是Apple的父类,也是orange的父类。但是你不能说Fruit就是Apple或者orange。

   代码测试如下:

 1 package xayd.hjj;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 class A{}
 6 class B extends A implements F{}
 7 class C extends A{}
 8 class D extends A{}
 9 class E{}
10 interface F{}
11 public class Test{
12     public void a(List<? extends A> list){
13         list.add(null);        //编译通过,但无实际意义
14         // list.add(new B());  //编译不能通过
15         // list.add(new A());  //编译不能通过
16
17     }
18
19     public static void main(String[] args) {
20         Test test = new Test();
21         List<? extends A> listB = new ArrayList<B>();
22         test.a(listB);
23
24     }
25 }

  

  通配符下限:<? super B>

  List<? super B> list = new ArrayList<A>();

  这样定义一个list的时候,允许向这个list添加对象。list可以接受其B类型和B的父类。像list中添加对象的时候编译器能确定确切类型。也可以这样理解:Fruit是Apple的父类,也是orange的父类。我们可以说Apple就是一个Fruit。

   代码测试如下:

 1 package xayd.hjj;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 class A{}
 6 class B extends A implements F{}
 7 class C extends A{}
 8 class D extends A{}
 9 class E{}
10 interface F{}
11 public class Test{
12
13     public void b(List<? super B> list){
14
15
16         list.add(new B());     ////编译通过
17         //list.add(new A());   //编译不能通过,要使用类型转换
18         list.add((B) new A()); ////编译通过
19
20     }
21     public static void main(String[] args) {
22         List<? super B> listA = new ArrayList<A>();
23         test.b(listA);
24
25
26
27
28     }
29 }
时间: 2024-10-22 17:55:04

JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)的相关文章

Java泛型中extends和super的理解(转)

E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S.U.V – 2nd.3rd.4th types Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T.E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换. ?

浅谈Java泛型之&lt;? extends T&gt;和&lt;? super T&gt;的区别

关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通.一般.通用的,是一个概括性的词,那么泛型从名字上也就好理解了,它是一种通用类型,是java中各种类型的概括. ?是java泛型中的通配符,它代表java中的某一个类,那么<? extends T>就代表类型T的某个子类,<? super T>就代表类型T的某个父类. 这里我们先定义一组

Java泛型 通配符? extends与super

本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object extends 示例 static class Food{} static class Frui

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)

JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型  其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1.str2的值是可变的.而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和st

java 泛型实例详解(普通泛型、 通配符、 泛型接口)

java 泛型详解(普通泛型. 通配符. 泛型接口) 2013-02-04 19:49:49| 分类: JAVA | 标签:java |举报|字号 订阅 下载LOFTER客户端 JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String

java泛型---通配符,泛型嵌套

package generic; import java.util.ArrayList; import java.util.List; /** * ? -->通配符,类型不确定,用于声明 变量|形参 上 * 不能用在: * 1,创建对象 * 2,创建泛型类 .泛型方法.泛型接口上 * */ public class WildcardTest { public static void main(String[] args) { //声明 List<?> list = new ArrayLi

java 泛型详解(普通泛型、 通配符、 泛型接口)

java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其 实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1.str2的值是可变的.而泛型也是一样的,这样写class Java_Generics<K

Java泛型中通配符的使用

学习目标 掌握通配符"?" 的使用 掌握受限泛型的设置 掌握泛型与子类继承的限制 匹配任意类型的通配符 在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行传递的时候泛型类型必须匹配才可以传递.否则是无法传递的. class Info<T>{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; }

JAVA泛型-通配符

黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA泛型-通配符 一.泛型与继承 有如下的继承关系和以它们为类型参数的泛型: public class Holder<T>{ T t; public Holder(){} public Holder(T at){ t = at;} public void set(T at){ t = at;} public T get(){return t; } } //有如下代码: Holder<Apple> apple