您的位置:首页 > 编程语言 > Java开发

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

2013-12-28 18:48 555 查看
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反射+泛型实际应用) :参考博文:/article/4847532.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. 通配符的下界, 形如:[b]List<? super Animal>[/b]

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐