从网上搜集资料整理:
百度知道资料:
http://baike.baidu.com/view/1436058.htm
http://blog.csdn.net/explorers/article/details/454837
代码讲解:http://www.java2000.net/p7927
http://book.csdn.net/bookfiles/413/10041314917.shtml
泛型:
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。特点:
1.泛型声明是一次编译,永远使用,它会变成一个单独的class文件,就像一个普通
的类或接口声明。
2.本质是参数化类型。
3.泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
4.同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
5.泛型的类型参数可以有多个。
6.泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
7.泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);
8.在类中包含参数化方法,而这个方法所在的类可以是泛型类,也可以不是泛型类。也就是说,是否拥有泛型方法,与其所在的类是否是泛型没有关系。
泛型方法使得该方法能够独立于类而产生变化。以下是一个基本的指导原则:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
9.
示例对比:
声明:
1.List myIntList = new LinkedList();//1
myIntList.add(new Integer(0));//2
Integer x = (Integer) myIntList.iterator().next();//3
强制类型转换(编译器只能保证迭代器返回的
是一个对象,要保证对Integer类型变量的赋值是类型安全的话,必须进行类型转换。
类型转换可能会导致运行时错误。
)
2.List<Integer> myIntList = new LinkedList<Integer>();//1
myIntList.add(new Integer(0));//2'
Integer x = myIntList.iterator().next();//3
(编译器知道了myIntList的存储类型,遍历时不需要强制转换。程序(特别是大型的程序)的可读性和健壮性得到了提高)
继承性:
List<String> ls = new ArrayList<String>();//1
List<Object> lo = ls;//2(编译出错 虽然String时Object的子类,但泛型参数化后,ls不是lo的子类,不能转化。泛型参数化后集合里的东西假想为不会改变的,我们的本能把这些东西看作是不变的。)
简单src:
package test;
import java.util.ArrayList;
import java.util.List;
public class TestFanXing<E> {
List <E> list = new ArrayList<E>();
private E ob;
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
public E getOb() {
return ob;
}
public void setOb(E ob) {
this.ob = ob;
}
public static void main(String[] args) {
TestFanXing<String> t = new TestFanXing<String>();
t.list.add("aaa");
t.ob="bbb";
System.err.println(t.list.get(0)+t.ob);
}
}
package test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class TestFanxingT<T extends Collection,K> {
//也可以用T:代表Object及其子类型,
//但不能用?(通配符范围是Object及其子类型)实例化时可用
private T x;
private K k;
public TestFanxingT(T x,K k) {
this.x = x;
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public K getK() {
return k;
}
public void setK(K k) {
this.k = k;
}
/*
* 将数组值装进List集合并返回List(泛型方法此时类不需要声明为泛型类)
*/
public <G> List<G> getList(G[] arr){
List <G>list = new ArrayList<G>();
for(G obj:arr){
list.add(obj);
}
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestFanxingT <ArrayList,String> t1 = null;
t1 = new TestFanxingT<ArrayList,String>(new ArrayList(),"k");
//TestFanxingT <Collection,Integer> t21 = null;//声明为 Collection编译出错:转换出错,用t2,t3方式声明ok
//t21 = new TestFanxingT<ArrayList,Integer>(new ArrayList(),new Integer(2));
TestFanxingT <? extends Collection,Integer> t2 = null;//?
t2 = new TestFanxingT<ArrayList,Integer>(new ArrayList(),new Integer(2));
TestFanxingT <?,Float> t3 = null;
t3 = new TestFanxingT<ArrayList,Float>(new ArrayList(),new Float(2));
//call getList()
TestFanxingT <?,Integer> t4 = null;
t4 = new TestFanxingT<ArrayList,Integer>(new ArrayList(),new Integer(2));
//int[] arr = new int[]{1,2,3};//简单数组类型不可以,因为范型参数是Object类型
Integer[] arr = new Integer[]{1,2,3};
List<Integer> list = t4.getList(arr);
for(Integer obj:list){
System.out.println(obj);
}
}
}
反射:
参考资料:http://dev.csdn.net/article/49/49876.shtm
http://orangewhy.iteye.com/blog/56011
http://www.iteye.com/topic/137944
分享到:
相关推荐
基于泛型反射的数据层封装+MSSQLJDBC3.0驱动 CSDN学生大本营文章代码
泛型 反射 概念 方法 使用
先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
JAVA中 关于泛型 以及反射的例子 欢迎下载 一起研究
同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习
Java基础入门(四)-泛型、反射、注解
C#泛型和反射联合使用的实例代码,绝对正常运行,含义注释,有问题和建议可留言!
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
在C#中通过反射操作一个List泛型。。
基本
反射+泛型+三层 ^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^
java的基于泛型+反射的通用DAO例子,原创,没事写着玩的,请多指教哈。。。
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
详细介绍了JAVA泛型和反射,对学习JAVA很有帮助哦!!!!
C#泛型、反射实例,分层,自动生成sql语句
鉴于使用三层架构的过程中,数据库变动造成大量代码改动的问题,特意对三层架构进行了改进,数据库变动只需要简单...本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习
DataReader反射泛型实体对象。数据库已有。完整的例子。
初步学习Java的泛型和反射机制,通过一些简单的例子来学习泛型,反射
java泛型+反射使用的源码,比较详细,欢迎下载