泛型中使用 ?作为通配符。通配符的使用与普通的类型参数相似,如通配符可以利用 extends 关键字来设置取值上限,用 super 来设置取值下限。
例如:
<? extends Number> 表示Byte、Short、Integer、Float、Double等都符合这个类型参数。
<? super Number> 表示该类型参数是 Number类的父类,如Object.
心法领悟189:通配符 在泛型中的应用。
Java中的数组支持 协变 类型,即如果方法参数是数组T,而S是T的子类,则方法也可以使用参数S。对于泛型类则没有这个特性。为了弥补这个不足,Java推出了 通配符类型参数。 在本实例中,只需要声明参数类型为 List<? extends Number>的一个方法,就可以使用List<Integer>、List<Double>、List<Long>等类型参数。
package com.mingrisoft.generic; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class WildcardsTest { public static Object getMiddle(List<? extends Number> list) { return list.get(list.size() / 2); } public static void main(String[] args) { List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); ints.add(3); System.out.print("整型列表的元素:"); System.out.println(Arrays.toString(ints.toArray())); System.out.println("整型列表的中间数:" + getMiddle(ints)); List<Double> doubles = new ArrayList<Double>(); doubles.add(1.1); doubles.add(2.2); doubles.add(3.3); System.out.print("浮点列表的元素:"); System.out.println(Arrays.toString(doubles.toArray())); System.out.println("浮点列表的中间数:" + getMiddle(doubles)); } }
结果:
整型列表的元素:[1, 2, 3] 整型列表的中间数:2 浮点列表的元素:[1.1, 2.2, 3.3] 浮点列表的中间数:2.2
相关推荐
在使用反射操作泛型类时,由于类型信息在运行时被擦除,所以反射无法获取到泛型的实际类型,只能获取到边界类型或者`Object`。 通过理解和掌握以上泛型的关键知识点,开发者能够编写更安全、更具可读性的代码,...
- 异常类也不能使用泛型,因为异常实例的创建是在抛出异常时进行的,此时类型参数的值还不确定。 7. **多态与泛型**: - 如果子类和父类都使用了泛型,如`A<Object>`和`B<String>`,它们之间没有直接的继承关系。...
3. **消除冗余的类型转换**:在使用泛型之前,我们经常需要在从集合中取出元素时进行类型转换,而泛型消除了这个需求。 4. **代码重用**:泛型类和方法可以处理多种数据类型,从而提高了代码的复用率。 在JDK 1.5中...
泛型引入的主要目标是消除强制类型转换的需要,减少类型转换带来的潜在错误,并增强代码的可读性和可维护性。 1. **泛型介绍** 在Java中,泛型的基本概念是通过在类、接口或方法声明中使用类型参数来实现的。例如...
Java反射与泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的工具来增强代码的灵活性和类型安全性。在本教程中,我们将深入探讨这两个主题,帮助你更好地理解和运用它们。 **Java反射** Java反射机制...
Java中的多线程和泛型是程序设计中的关键概念,它们极大地增强了代码的并发性和可复用性。在Java中,实现多线程有两种主要方式:一是通过继承`Thread`类,二是通过实现`Runnable`接口。通常推荐使用实现`Runnable`...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。本篇文章将带你入门Java泛型,通过实例深入理解其核心概念。 1. **泛型的基本概念** - 泛型...
Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...
定义泛型类:展示如何定义一个简单的泛型类,以及如何创建该类的实例并使用泛型参数。 泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,...
- 泛型类实例化:创建泛型类的实例时,需要指定类型参数的实际类型,如`TestGen, Integer> t = new TestGen, Integer>();` 2. **泛型通配符** - 无界通配符:`?`表示任何类型,但无法在方法内部进行添加操作,...
- 泛型接口和泛型类可以作为参数传递,利用协变和逆变的概念,增强代码的兼容性。 8. 泛型与继承: - 泛型类的子类可以选择继承父类的类型参数,或者指定自己的类型参数。 - 泛型方法的重写需要保持类型参数的...
- `FanXingDemo` 可能是一个包含泛型使用示例的Java程序,它可能展示了如何定义泛型类、泛型方法以及如何利用泛型与集合框架进行交互。 7. 泛型与多态 - 泛型结合多态可以创建强大的设计模式,如工厂方法和策略...
通配符允许我们在不关心具体类型的情况下使用泛型。例如,我们可以定义一个接受任何类型List的方法: ```java public void printList(List<?> list) { // 只能调用无参数的方法,不能添加或修改元素 for ...
- 泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法声明中使用类型参数,从而增强了类型检查和避免了类型转换的繁琐。 - 泛型的主要目标是提高代码的类型安全性,防止在运行时出现ClassCastException。 - ...
Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。...在实际开发中,根据需求合理使用泛型,可以避免许多潜在的运行时错误,并增强代码的灵活性。
- **泛型实例化**:当使用泛型类或方法时,需要指定具体的类型参数来实例化泛型。 - **3.2.2 获取泛型类型和使用相应的泛型版本替换 ArrayList** - **类型获取**:使用 `typeof(T)` 来获取泛型类型的信息。 - *...
* 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...
泛型编程是Java、C#等面向对象编程语言中的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而实现代码的复用并提供编译时的类型安全检查。本教程将以Java中的List接口为例,深入探讨泛型编程的概念、...
总的来说,Java的泛型提供了更强大的类型系统,增强了代码的可读性和安全性,降低了类型转换的风险,是现代Java开发不可或缺的一部分。通过理解和熟练运用泛型,开发者可以编写出更加高效和健壮的程序。