`
cakin24
  • 浏览: 1389135 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

泛型方法的使用

    博客分类:
  • java
阅读更多

一 泛型方法的介绍

如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类型形参,这也是可以的,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集合里的元素类型的子类即可。

0
1
分享到:
评论

相关推荐

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类是具有一个或多个类型参数的类。类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时...

    【Flutter】Dart 泛型 ( 泛型类 泛型方法 特定类型约束的泛型 ).zip

    【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照

    泛型方法的使用.rar

    在本教程中,我们将深入探讨C#中的泛型方法的使用。 首先,让我们理解什么是泛型方法。泛型方法是在定义方法时引入了一个或多个类型参数,这些类型参数在方法被调用时由实际的类型替换。这使得同一个方法可以处理...

    简单学习C#中的泛型方法使用

    本文将深入探讨C#中的泛型方法使用。 首先,泛型方法是通过类型参数(Type Parameter)来定义的,类型参数以尖括号 `&lt;T&gt;` 表示,其中`T`是占位符,代表任何引用类型或值类型。在上面的示例中,`Swap&lt;T&gt;` 方法就是一...

    c#泛型类、泛型方法、泛型接口、泛型委托

    泛型方法是在特定类或结构体中定义的,只在该方法内部使用类型参数。这样,方法可以处理多种数据类型,而无需重复编写相同代码。例如,以下代码展示了一个交换两个元素值的方法: ```csharp public static void ...

    C#泛型集合使用实例

    泛型队列遵循先进先出(FIFO)原则,使用`Enqueue`方法添加元素到队尾,`Dequeue`方法移除并返回队首元素。`Queue&lt;T&gt;`实现了`ICollection&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口。 6. **泛型栈(Stack)** 栈遵循后进先出...

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

    Java中的泛型方法演示代码

    在这个“Java中的泛型方法演示代码”中,我们可以期待看到如何在Java中定义和使用泛型方法的实例。 首先,泛型方法的基本语法是在方法声明前加上尖括号`&lt;&gt;`,并在其中定义一个或多个类型参数。例如: ```java ...

    java泛型的使用

    通过这些实例,你可以探索如何在实际编程中应用这些概念,如创建泛型集合,编写泛型方法,理解类型擦除的影响,以及在边界和通配符上的运用。学习和掌握Java泛型对于编写高效、类型安全的代码至关重要。在这个压缩包...

    【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET

    【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET

    泛型和方法

    首先,泛型是Java 5引入的一项重要特性,它允许在类、接口和方法中使用类型参数,从而实现泛型类和泛型方法。泛型的主要目标是提供编译时类型检查,防止在集合中存储不兼容的数据类型,避免了强制类型转换的麻烦和...

    Java中泛型的各种使用

    泛型方法的声明方式是在方法返回类型前加上类型参数。例如,`public static &lt;T&gt; void printArray(T[] array) {...}`,`printArray`方法可以接受任何类型的数组。 4. 泛型的边界 有时候我们需要限制类型参数的范围,...

    c# 泛型的使用,教你如何用泛型

    3. **泛型方法**:在类或结构中,可以定义一个或多个泛型方法。这些方法在其签名中包含类型参数,可以在方法内部使用。例如,`public T Max(params T[] values)` 方法会返回传入数组中的最大值。 4. **泛型约束**:...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,以及如何进行类型边界约束。 泛型接口:演示如何定义和实现泛型接口,并通过示例代码...

    泛型的使用

    泛型方法与泛型类类似,但它们只在方法级别使用类型参数。例如,一个返回两个参数最大值的泛型方法: ```java public static &lt;T extends Comparable&lt;T&gt;&gt; T max(T a, T b) { if (a.compareTo(b) &gt; 0) { return a; ...

    泛型 反射 相关概念方法使用

    泛型和反射是Java编程语言中的两个重要特性,它们各自有着独特的功能,但在某些场景下也可以结合使用。本文将深入探讨这两个概念以及相关的使用方法。 首先,我们来了解泛型。泛型是Java 5引入的一项特性,它允许在...

Global site tag (gtag.js) - Google Analytics