`
sharewind
  • 浏览: 156689 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Java泛型通配符extends与super

    博客分类:
  • Java
 
阅读更多

 

Java 泛型

关键字说明

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

extends 示例

static class Food{}
static class Fruit extends Food{}
static class Apple extends Fruit{}
static class RedApple extends Apple{}

List<? extends Fruit> flist = new ArrayList<Apple>();
// complie error:
// flist.add(new Apple());
// flist.add(new Fruit());
// flist.add(new Object());
flist.add(null); // only work for null 

List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。

Fruit fruit = flist.get(0);
Apple apple = (Apple)flist.get(0);

由于,其中放置是从Fruit中继承的类型,所以可以安全地取出Fruit类型。

flist.contains(new Fruit());
flist.contains(new Apple());

在使用Collection中的contains 方法时,接受Object 参数类型,可以不涉及任何通配符,编译器也允许这么调用。

super 示例

List<? super Fruit> flist = new ArrayList<Fruit>();
flist.add(new Fruit());
flist.add(new Apple());
flist.add(new RedApple());

// compile error:
List<? super Fruit> flist = new ArrayList<Apple>();

List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.

// compile error:
Fruit item = flist.get(0);

因为,List<? super Fruit>中的类型可能是任何Fruit 的超类型,所以编译器无法确定get返回的对象类型是Fruit,还是Fruit的父类Food 或 Object.

小结

extends 可用于的返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。
>带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》
分享到:
评论

相关推荐

    Java泛型通配符

    Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

    泛型中extends和super的区别Java系列2021.pdf

    在Java中,extends和super是两个重要的泛型通配符,它们用于限制类型参数的范围。了解它们的区别非常重要,否则可能会导致编程错误。 extends关键字 在泛型中,extends关键字用于限制类型参数的上界。例如,List...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示参数化类型可能是 T 或 T 的子类。例如: List&lt;? extends Fruit&gt; flist = new ...

    Java泛型extends及super区别实例解析

    Java泛型中的通配符(Wildcards)和边界(Bounds)是两个重要的概念,分别由 &lt;? extends T&gt; 和 &lt;? super T&gt; представляют。这些概念的出现是为了解决泛型中的一些问题。 &lt;? extends T&gt;:是指“上界...

    Java中泛型通配符的使用方法示例

    Java 中泛型通配符的使用方法示例主要介绍了 Java 中泛型通配符的使用方法,结合实例形式分析了 Java 中泛型通配符的功能、语法及在泛型类创建泛型对象中的使用方法。以下是 Java 中泛型通配符的使用方法示例的知识...

    java泛型技术之发展

    4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步优化,如类型推断(Type Inference),使得编写泛型代码更加简洁。 二、核心概念 1. 泛型类:可以带有类型参数的类,例如`ArrayList&lt;T&gt;`,这里的...

    java泛型的内部原理及更深应用

    2. **边界通配符**:在处理泛型时,我们经常遇到边界通配符,如`&lt;? extends T&gt;`和`&lt;? super T&gt;`。前者表示类型参数可以是T或T的任何子类型,后者则表示类型参数可以是T或T的任何超类型。这些通配符允许我们编写更...

    SUN公司Java泛型编程文档

    6. **基本类型与泛型**:Java泛型不支持原始类型(如int、char)作为类型参数,但可以通过使用专门的通配符如`Integer[]`或`? extends Number`来间接实现。 7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类...

    关于java基础的泛型的练习

    - 泛型通配符:例如`?`,表示任意类型。`List&lt;?&gt;`表示可以容纳任何类型的列表。 - 上界通配符:`&lt;? extends T&gt;`限制了只能传入T或T的子类类型的对象。 - 下界通配符:`&lt;? super T&gt;`限制了只能传入T或T的父类类型...

    java泛型常用通配符实例解析

    java泛型常用通配符实例解析 ...本文详细介绍了Java泛型常用通配符实例解析,包括限定通配符和无限定通配符的使用方法,以及`&lt;? super E&gt;`的用法。希望本文能够对大家的学习和工作产生一定的参考价值。

    Java泛型总结(2)进阶篇

    在本文中,我们将深入探讨Java泛型的进阶概念,包括通配符、边界、类型擦除以及在实际开发中的应用。 1. 通配符 通配符在Java泛型中扮演着重要角色,它允许我们处理多种类型的参数。例如,`&lt;?&gt;` 表示未知类型,...

    关于C#、java泛型的看法

    Java的泛型约束则相对较少,主要通过extends和super关键字来限制类型参数的范围。 在实际应用中,C#的泛型在效率上可能具有优势,因为编译器能够对泛型进行更深入的优化。例如,C#的泛型集合类如List在运行时可以...

    Java泛型技术之发展.pdf

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...

    java泛型Demo

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。泛型的主要目的是提供类型安全,帮助程序员在编译时发现可能的类型错误,同时也提供了更好的代码重用。在这个"java泛型Demo"中,我们...

    java 泛型入门 实例

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。本篇文章将带你入门Java泛型,通过实例深入理解其核心概念。 1. **泛型的基本概念** - 泛型...

    浅谈Java泛型通配符解决了泛型的许多诟病(如不能重载)

    本文将深入探讨Java泛型通配符如何解决这一问题。 首先,我们需要理解泛型的基本概念。泛型允许我们在定义集合(如List)时指定元素的类型,确保在编译时期就能捕获类型错误。例如,`List&lt;String&gt;` 只能存储字符串...

Global site tag (gtag.js) - Google Analytics