泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
其中通配符“?”表示未知类型,可以是任何引用类型。通配符一般会结合extend或super使用,来约束泛型的类型上界和类型下界。
<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
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>(); flist.add(null); // compile error // flist.add(new Apple()); // flist.add(new Fruit()); // flist.add(new Object());
List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。
Fruit fruit = flist.get(0); Apple apple = (Apple)flist.get(0); flist.contains(new Fruit()); flist.contains(new Apple());
其中放置是从Fruit中继承的类型,所以可以安全地取出Fruit类型。
在使用Collection中的contains 方法时,接受Object 参数类型,可以不涉及任何通配符,编译器也允许这么调用。
<? super T> 表示类型下界,表示参数化类型是此类型的超类型(父类型),直至Object
static class RedApple extends Apple{}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 可用于参数类型限定,不能用于返回类型限定。
相关推荐
Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...
* 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...
Java泛型通配符T、E、K、V区别详解 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口...
本文将深入探讨Java泛型通配符如何解决这一问题。 首先,我们需要理解泛型的基本概念。泛型允许我们在定义集合(如List)时指定元素的类型,确保在编译时期就能捕获类型错误。例如,`List<String>` 只能存储字符串...
Java 中泛型通配符的使用方法示例主要介绍了 Java 中泛型通配符的使用方法,结合实例形式分析了 Java 中泛型通配符的功能、语法及在泛型类创建泛型对象中的使用方法。以下是 Java 中泛型通配符的使用方法示例的知识...
接下来,让我们详细讨论 Java 泛型的关键字和通配符。 extends 和 super 的区别 在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示...
java基础-泛型通配符
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`<T>`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...
Java泛型中T和问号(通配符)的区别 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、...
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...
java泛型常用通配符实例解析 Java泛型是Java 5中引入的一项新特性,可以用来编写泛型代码,使得代码更加灵活和可重用。其中,通配符是泛型中的一种重要概念,本文将详细介绍Java泛型常用通配符实例解析。 1. 限定...
6. **基本类型与泛型**:Java泛型不支持原始类型(如int、char)作为类型参数,但可以通过使用专门的通配符如`Integer[]`或`? extends Number`来间接实现。 7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类...
- 泛型通配符:例如`?`,表示任意类型。`List<?>`表示可以容纳任何类型的列表。 - 上界通配符:`<? extends T>`限制了只能传入T或T的子类类型的对象。 - 下界通配符:`<? super T>`限制了只能传入T或T的父类类型...