Java定义泛型方法实例分析

本文实例讲述了Java定义泛型方法。分享给大家供大家参考,具体如下:

一 点睛

1 如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类型形参,这也是可以的,JDK1.5还提供了泛型方法的支持。

2 泛型方法的语法格式为:

修饰符 <T , S> 返回值类型 方法名(形参列表)
{
    //方法体...
}

3 泛型方法的方法签名比普通方法的方法签名多了类型形参声明,类型形参声明以尖括号括起来,多个类型形参之间以逗号(,)隔开,所有类型形参声明放在方法修饰符和方法返回值类型之间。

4 与类、接口中使用泛型参数不同的是,方法中的泛型参数无需显式传入实际类型参数,因为编译器根据实参推断类型形参的值。它通常推断出最直接的类型参数。

5 大时候都可以使用泛型方法来代替类型通配符。

6 泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系。如果没有这样的类型依赖关系,不应该使用泛型方法。

二 实战

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);
  }
}

三 错误用法

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);
  }
}

四 正确用法

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);
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java泛型之上界下界通配符详解

    泛型,继承和子类 如你所知,只要类型兼容,就可以将一种类型的对象分配给另一种类型的对象.例如,你可以指定一个整数一个对象,因为对象是一个整数的超类型: Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // 好 在面向对象的术语中,这被称为"是一种"关系.由于Integer 是一种Object,因此允许赋值.但是Integer也是一种Num

  • Java 获取泛型的类型实例详解

    Java 获取泛型的类型实例详解 Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等. 以下方式是不正确的: ①.获取带泛型的类的类型 Class lstUClazz = List<User>.class ②获取局部变量泛型的类型 List<User> listUser = new ArrayList<User>(); Type genType = listUser.getClass().getClass().getGenericSuperc

  • 简单理解java泛型的本质(非类型擦除)

    背景 之前在网上发现这个问题 public class GenericTest { //方法一 public static <T extends Comparable<T>> List<T> sort(List<T> list) { return Arrays.asList(list.toArray((T[]) new Comparable[list.size()])); } //方法二 public static <T extends Compara

  • 详解Java泛型及其应用

    引出泛型 我们通过如下的示例,引出为什么泛型的概念. public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add("abc"); list.add(2); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); // error System.out

  • 浅谈java中定义泛型类和定义泛型方法的写法

    1.方法中的泛型 public static <T> T backSerializable(Class<T> clazz , String path ,String fileName){ FileInputStream fis = null; ObjectInputStream ois = null; Object obj = null; try { fis = new FileInputStream(path + fileName); ois = new ObjectInputS

  • JAVA利用泛型返回类型不同的对象方法

    有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象.此时就需要用到泛型. 首先先解释个概念, 元组:它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改. 利用泛型创建元组 public class ReturnTwo<A,B> { public final A first; public final B second; public ReturnTwo(A a,B b) { first = a; second = b

  • Java 7菱形语法与泛型构造器实例分析

    本文实例讲述了Java 7菱形语法与泛型构造器.分享给大家供大家参考,具体如下: 一 实战--泛型构造器 1 代码 class Foo { public <T> Foo(T t) { System.out.println(t); } } public class GenericConstructor { public static void main(String[] args) { // 泛型构造器中的T参数为String. new Foo("疯狂Java讲义"); //

  • Java中的泛型详解

    所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数,也可称为类型实参) 泛型类或接口 "菱形"语法 复制代码 代码如下: //定义   public interface List<E> extends Collection<E>    public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V

  • java泛型学习示例

    Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter).声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到.其中的优点不言而喻,我们可以横向扩展更多的类,缺点呢,其实也就是他的优点,因为这需要我们在使用泛型类的时候,要很清楚自己的代码目地,不能使用错误的类型. 最基本的泛型类 复制代码 代码如下: package com.garinzhang.jav

  • Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: //获取Field对象f的类型 Class<?> a = f.getType(); 通过这种方式只对普通类型的Field有效.但如果该Field的类型是有泛型限制的类型,如Map<String , Integer>类型,则不能准确的得到该Field的泛型参数. 为了获得指定Field

  • 基于java中泛型的总结分析

    要我直接说出泛型是个what我还真讲不出来,这里先由一道问题引入: 定义一个坐标点类,要求能保存各种类型的数据,如:整形,浮点型,和字符串类型 既然变量类型起先不确定,那么很容易想到就是用所有类型的父类,也就是Object类来代替 不废话了,用代码来体现 实例1:用Object来实现不确定的数据类型输入 复制代码 代码如下: //这是定义的坐标点类class Point {    private Object x;    private Object y; //用Object来表示不确定的类型 

  • Java泛型和Class类用法示例

    本文实例讲述了Java泛型和Class类用法.分享给大家供大家参考,具体如下: 一 点睛 从JDK1.5之后,Java的Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class 的类型实际上是Class<String>. 使用Class<T>泛型可以避免强制类型转换. 二 实战1 import java.util.*; import javax.swing.*; public class CrazyitObjectFactory2 { publ

随机推荐