Java中“泛型之泛型类、泛型方法“和'泛型通配符"的应用总结

来源:互联网 发布:帝国cms根目录 编辑:程序博客网 时间:2024/06/02 01:01

Java中"泛型"和"泛型通配符"的应用总结

    一  泛型  

      泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}。这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类型,例如:Test<Object> t = new Test<Object>();,指明泛型T的类型为Object。

         Java 泛型中的:<T> ,< E>,<K>,<V>,<N> 代表的意义:

          一般情况下:T表示type(类型); K 表示key(键);V表示value(值);E表示entry (实体)或element。其实<T> <E> <K,V>这些字母都只是一个符号,自己定义泛型类时,随便你自己写什么字母的,在实际使用中用自己的类名代替就可以了,但通常情况下使用上述几种大家都比较熟知的符号。

       但是Java中的泛型方法就比较复杂了。

       另外,***联合实体类(Java反射+泛型实际应用) :参考博文:http://www.cnblogs.com/iyangyuan/archive/2013/04/19/3029814.html

       泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型。

      1.  "定义泛型方法"语法格式如下:


     2.  调用泛型方法语法格式如下:

       说明一下定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值

       Class<T>的作用就是指明泛型的具体类型,而Class<T>类型的变量c,可以用来创建泛型类的对象。

       为什么要用变量c来创建对象呢?既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象

       泛型方法要求的参数是Class<T>类型,而Class.forName()方法的返回值也是Class<T>,因此可以用Class.forName()作为参数。其中,forName()方法中的参数是何种类型,返回的Class<T>就是何种类型。在本例中,forName()方法中传入的是User类的完整路径,因此返回的是Class<User>类型的对象,因此调用泛型方法时,变量c的类型就是Class<User>,因此泛型方法中的泛型T就被指明为User,因此变量obj的类型为User。

       当然,泛型方法不是仅仅可以有一个参数Class<T>,可以根据需要添加其他参数。

       为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

二 、泛型通配符

1. 通配符的上界, 形如:List<?extends Animal>

2. 通配符的下界, 形如:List<? super Animal>

3.无界通配符,形如:如List<?>,“?”不加任何修饰,单独一个“?”,可以代表任意类型,“任意”也就是未知类型。 无界通配符通常会用在下面两种情况:

 (1)、当方法是使用原始的Object类型作为参数时,如下:

public static void printList(List<Object> list) {    for (Object elem : list)        System.out.println(elem + "");    System.out.println();}可以选择改为如下实现:public static void printList(List<?> list) {    for (Object elem: list)        System.out.print(elem + "");    System.out.println();}这样就可以兼容更多的输出,而不单纯是List<Object>,如下:List<Integer> li = Arrays.asList(1, 2, 3);List<String>  ls = Arrays.asList("one", "two", "three");printList(li);printList(ls);

(2)、在定义的方法体的业务逻辑与泛型类型无关,如List.size,List.cleat。实际上,最常用的就是Class<?>,因为Class<T>并没有依赖于T。

最后提醒一下的就是,List<Object>与List<?>并不等同,List<Object>是List<?>的子类。还有不能往List<?> list里添加任意对象,除了null。


附:Java泛型方法演示代码。

点击下载

参考博文:http://blog.csdn.net/baple/article/details/25056169

http://kimibob.blog.163.com/blog/static/163873051201221185020628/

0 0