一 泛型方法的介绍
如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类型形参,这也是可以的,JDK1.5还提供了泛型方法的支持。
泛型方法的语法格式为:
修饰符 <T , S> 返回值类型 方法名(形参列表)
{
//方法体...
}
泛型方法的方法签名比普通方法的方法签名多了类型形参声明,类型形参声明以尖括号括起来,多个类型形参之间以逗号(,)隔开,所有类型形参声明放在方法修饰符和方法返回值类型之间。
二 泛型方法的正确使用
1 代码示例
import java.util.*; public class GenericMethodTest { // 声明一个泛型方法,该泛型方法中带一个T类型形参, static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); } } public static void main(String[] args) { Object[] oa = new Object[100]; Collection<Object> co = new ArrayList<>(); // 下面代码中T代表Object类型 fromArrayToCollection(oa, co); String[] sa = new String[100]; Collection<String> cs = new ArrayList<>(); // 下面代码中T代表String类型 fromArrayToCollection(sa, cs); // 下面代码中T代表Object类型 fromArrayToCollection(sa, co); Integer[] ia = new Integer[100]; Float[] fa = new Float[100]; Number[] na = new Number[100]; Collection<Number> cn = new ArrayList<>(); // 下面代码中T代表Number类型 fromArrayToCollection(ia, cn); // 下面代码中T代表Number类型 fromArrayToCollection(fa, cn); // 下面代码中T代表Number类型 fromArrayToCollection(na, cn); // 下面代码中T代表Object类型 fromArrayToCollection(na, co); // 下面代码中T代表String类型,但na是一个Number数组, // 因为Number既不是String类型, // 也不是它的子类,所以出现编译错误 // fromArrayToCollection(na, cs); } }
2 代码说明
与类、接口中使用泛型参数不同的是,方法中的泛型参数无需显式传入实际类型参数,因为编译器根据实参推断类型形参的值。它通常推断出最直接的类型参数。例如:调用如下代码。
fromArrayToCollection(sa, cs);
上面代码中cs是一个Collection<String>类型,与方法定义时的fromArrayToCollection(T[] a, Collection<T> c)进行比较,只比较泛型参数,不能发现该T类型形参代表的实际类型是String类型。
三 泛型方法的错误使用
1 代码示例
import java.util.*; public class ErrorTest { // 声明一个泛型方法,该泛型方法中带一个T类型形参 static <T> void test(Collection<T> from, Collection<T> to) { for (T ele : from) { to.add(ele); } } public static void main(String[] args) { List<Object> as = new ArrayList<>(); List<String> ao = new ArrayList<>(); // 下面代码将产生编译错误 test(as , ao); } }
2 运行结果
E:\test\Java\Java8\fanxing\src>javac ErrorTest.java
ErrorTest.java:20: 错误: 无法将类 ErrorTest中的方法 test应用到给定类型;
test(as , ao);
^
需要: Collection<T>,Collection<T>
找到: List<Object>,List<String>
原因: 推断类型不符合等式约束条件
推断: String
等式约束条件: String,Object
其中, T是类型变量:
T扩展已在方法 <T>test(Collection<T>,Collection<T>)中声明的Object
1 个错误
3 代码说明
上面程序中调用了test方法传入了两个实际参数,其中as的数据类型是List<String>,而ao的数据类型是List<Object>,与泛型方法签名进行对比test(Collection<T> a,Collection<T> c),编译器无法正确识别T所代表实际类型。
四 改进上面这个例子
1 代码示例
import java.util.*; public class RightTest { // 声明一个泛型方法,该泛型方法中带一个T形参 static <T> void test(Collection<? extends T> from , Collection<T> to) { for (T ele : from) { to.add(ele); } } public static void main(String[] args) { List<Object> ao = new ArrayList<>(); List<String> as = new ArrayList<>(); // 下面代码完全正常 test(as , ao); } }
2 代码说明
该代码可以编译通过,它改变了test签名,将该方法的前一个形参类型改为Collection<? extends T>,这种采用类型通配符的表示方式,只要test方法的前一个Collection集合里的元素类型是后一个Collection集合里的元素类型的子类即可。
相关推荐
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类是具有一个或多个类型参数的类。类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时...
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
在本教程中,我们将深入探讨C#中的泛型方法的使用。 首先,让我们理解什么是泛型方法。泛型方法是在定义方法时引入了一个或多个类型参数,这些类型参数在方法被调用时由实际的类型替换。这使得同一个方法可以处理...
本文将深入探讨C#中的泛型方法使用。 首先,泛型方法是通过类型参数(Type Parameter)来定义的,类型参数以尖括号 `<T>` 表示,其中`T`是占位符,代表任何引用类型或值类型。在上面的示例中,`Swap<T>` 方法就是一...
泛型方法是在特定类或结构体中定义的,只在该方法内部使用类型参数。这样,方法可以处理多种数据类型,而无需重复编写相同代码。例如,以下代码展示了一个交换两个元素值的方法: ```csharp public static void ...
泛型队列遵循先进先出(FIFO)原则,使用`Enqueue`方法添加元素到队尾,`Dequeue`方法移除并返回队首元素。`Queue<T>`实现了`ICollection<T>`和`IEnumerable<T>`接口。 6. **泛型栈(Stack)** 栈遵循后进先出...
这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...
在这个“Java中的泛型方法演示代码”中,我们可以期待看到如何在Java中定义和使用泛型方法的实例。 首先,泛型方法的基本语法是在方法声明前加上尖括号`<>`,并在其中定义一个或多个类型参数。例如: ```java ...
通过这些实例,你可以探索如何在实际编程中应用这些概念,如创建泛型集合,编写泛型方法,理解类型擦除的影响,以及在边界和通配符上的运用。学习和掌握Java泛型对于编写高效、类型安全的代码至关重要。在这个压缩包...
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET
首先,泛型是Java 5引入的一项重要特性,它允许在类、接口和方法中使用类型参数,从而实现泛型类和泛型方法。泛型的主要目标是提供编译时类型检查,防止在集合中存储不兼容的数据类型,避免了强制类型转换的麻烦和...
泛型方法的声明方式是在方法返回类型前加上类型参数。例如,`public static <T> void printArray(T[] array) {...}`,`printArray`方法可以接受任何类型的数组。 4. 泛型的边界 有时候我们需要限制类型参数的范围,...
3. **泛型方法**:在类或结构中,可以定义一个或多个泛型方法。这些方法在其签名中包含类型参数,可以在方法内部使用。例如,`public T Max(params T[] values)` 方法会返回传入数组中的最大值。 4. **泛型约束**:...
泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,以及如何进行类型边界约束。 泛型接口:演示如何定义和实现泛型接口,并通过示例代码...
泛型方法与泛型类类似,但它们只在方法级别使用类型参数。例如,一个返回两个参数最大值的泛型方法: ```java public static <T extends Comparable<T>> T max(T a, T b) { if (a.compareTo(b) > 0) { return a; ...
泛型和反射是Java编程语言中的两个重要特性,它们各自有着独特的功能,但在某些场景下也可以结合使用。本文将深入探讨这两个概念以及相关的使用方法。 首先,我们来了解泛型。泛型是Java 5引入的一项特性,它允许在...