Java - ? extends T 和 ? super T 理解(一)

简介: Java - ? extends T 和 ? super T 理解(一)

? 通配符类型

  • 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
  • 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

上界不能往里存,只能往外取

比如,我们现在定义:List首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何T的子类,那么我们看下面的代码


import java.util.LinkedList;
import java.util.List;
public class test {
    public static void main(String[] args) {
        List<? extends Father> list = new LinkedList<>();
        list.add(new Son());
    }
}
class Human{
}
class Father extends Human{
}
class Son extends Father{
}
class LeiFeng extends Father {
}

list.add(new Son());这行会报错

The method put(Son) is undefined for the type List

List 表示 “具有任何从Son继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List 赋值。你也许试图这样做


List<? extends Father> list = new LinkedList<Son>();
list.add(new Son());
  • 1
  • 2

即使你指明了为Son类型,也不能用add方法添加一个Son对象。

list中为什么不能加入Father类和Father类的子类呢,我们来分析下。

List表示上限是Father,下面这样的赋值都是合法的


   List<? extends Father> list1 = new ArrayList<Father>();
   List<? extends Father> list2 = new ArrayList<Son>();
   List<? extends Father> list3 = new ArrayList<LeiFeng>();
  • 1
  • 2
  • 3

如果List支持add方法的话:

  • list1可以add Father和所有Father的子类;
  • list2可以add Son和所有Son的子类;
  • list3可以add LeiFeng和所有LeiFeng的子类。
目录
相关文章
|
1月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
99 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
1月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
97 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
1月前
|
Java 程序员 编译器
【Java】继承、super、final、子类构造方法
【Java】继承、super、final、子类构造方法
26 0
|
2月前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
3月前
|
Java
【Java基础面试四十六】、 List<? super T>和List<? extends T>有什么区别?
这篇文章阐述了Java泛型中的List<? super T>和List<? extends T>的区别,解释了通配符的使用规则,以及Java泛型设计原则确保了编译时无警告则运行时无ClassCastException异常。
|
6月前
|
Java
【JAVA学习之路 | 基础篇】super关键字
【JAVA学习之路 | 基础篇】super关键字
|
6月前
|
Java 编译器
Java super的使用方法
Java super的使用方法
|
6月前
|
Java 编译器
【Java探索之旅】super 子类构造 掌握
【Java探索之旅】super 子类构造 掌握
39 0
|
Java
【Java面向对象】继承的认识与实现(2) 关键字 this 与 super 区别
【Java面向对象】继承的认识与实现(2) 关键字 this 与 super 区别
76 0
|
6月前
|
Java 程序员
类的继承和super,final关键字的使用(JAVA)
类的继承和super,final关键字的使用(JAVA)
56 0