`
zlotus
  • 浏览: 54181 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

泛型反射

    博客分类:
  • Java
阅读更多
从网上搜集资料整理:
百度知道资料:
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驱动

    在这个特定的案例中,"基于泛型反射的数据层封装"是利用了Java的泛型和反射特性来实现这一目标。泛型提供了一种在编译时类型安全的方式,允许我们创建可以处理多种类型的类、接口和方法。而反射则是Java提供的一种...

    java泛型反射注解

    先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...

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

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

    泛型反射联合使用.zip

    在C#编程中,泛型和反射是两种强大的特性,它们各自有着独特的功能,并且在特定情况下可以结合使用,以实现更加灵活和高效的代码。本文将深入探讨这两个概念及其联合应用。 首先,让我们理解什么是泛型。泛型是C# ...

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool&lt;Point&gt; pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    泛型反射例子

    JAVA中 关于泛型 以及反射的例子 欢迎下载 一起研究

    基于泛型和反射的三层架构雏形(另一个旧版不能删除)

    同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习

    Java基础入门四泛型反射注解.pdf

    Java基础入门系列是帮助初学者掌握Java编程的重要学习材料,本篇主要介绍了泛型、反射和注解这三大高级特性。 泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型...

    java泛型和反射机制

    对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握

    C#中通过反射操作泛型

    在C#中通过反射操作一个List泛型。。

    Java泛型的用法及T.class的获取过程解析

    2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型转换的代码。 4. MetaProgramming:泛型可以在编译期搞很多东西,比如MetaProgramming。 ...

    枚举泛型反射以及一些基本

    基本

    java 基于泛型与反射的通用 DAO

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们可以极大地提高代码的复用性和灵活性。本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。...

    反射+泛型+三层例子

    反射+泛型+三层 ^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^^-^

    JAVA5泛型和反射

    Java 5 引入了泛型和反射两个重要的特性,极大地增强了编程的灵活性和安全性。泛型主要是为了解决在编程中频繁进行类型转换的问题,而反射则允许程序在运行时动态地获取类的信息和调用方法。 泛型类型: 在 Java 5 ...

    C#泛型、反射实例、自动生成sql语句

    本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** 泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的...

    人才招聘网

    系统的核心技术包括泛型反射和泛型Ado.net,这两种技术的应用极大地提高了系统的灵活性和性能。 首先,我们要理解什么是泛型。在.NET框架中,泛型是一种强大的工具,它允许我们在不指定具体数据类型的情况下创建类...

    Java 中利用泛型和反射机制抽象DAO的实例

    Java 中利用泛型和反射机制抽象DAO的实例 Java 中利用泛型和反射机制抽象DAO的实例是指在 Java 中使用泛型和反射机制来抽象出一个通用的DAO(Data Access Object),从而将DAO抽象到另一层次,提高代码的质量和可...

    基于泛型和反射的三层架构雏形

    鉴于使用三层架构的过程中,数据库变动造成大量代码改动的问题,特意对三层架构进行了改进,数据库变动只需要简单...本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习

    DataReader反射泛型实体对象

    使用反射和泛型,我们可以编写一个通用方法,接收`DataReader`和类型信息作为参数,然后逐行读取数据,利用反射实例化指定类型的对象并设置属性值。 示例代码可能如下: ```csharp public static T ...

Global site tag (gtag.js) - Google Analytics