`

Java基础八:泛型,?通配符

阅读更多
/**
 * JDK1.5 泛型
 * 
 * @author 张明学
 * 
 */
public class GenericStudy {

	@SuppressWarnings( { "unchecked", "unused" })
	public static void main(String[] args) throws Exception {
		// 第1点:Java的泛型仅仅只是通用Java的编译器实现的,进行全安检查,编译成class文件后没有保留泛型信息
		Collection<Integer> c1 = new ArrayList<Integer>();
		Collection<String> c2 = new ArrayList<String>();
		// 1.1 获取c1与c2的字节码看是否相同
		System.out.println("c1与c2的字节码是否相同:" + (c1.getClass() == c2.getClass()));// true
		c1.add(23);
		// 1.2 通用反射我们可以向c1中添加String类型的数据(class文件没有任何泛型)
		Class clazz = c1.getClass();
		Method collAddMethod = clazz.getMethod("add", Object.class);
		collAddMethod.invoke(c1, "http://zmx.iteye.com");
		for (Object obj : c1) {
			System.out.println(obj);
		}

		// 泛型中的?通配符:表示任何类型,它与Object是有区别的如下所示:
		// collection1可以存放任保类型,而collection2则只能放在Object类型
		Collection<?> collection1 = new ArrayList<String>();
		collection1 = new ArrayList<Integer>();
		collection1 = new ArrayList<Object>();
		Collection<Object> collection2 = new ArrayList<Object>();
		// 泛型中的向上或向下限定
		// collection3表示它可以存放Number或Number的子类
		Collection<? extends Number> collection3 = null;
		collection3 = new ArrayList<Number>();
		collection3 = new ArrayList<Double>();
		collection3 = new ArrayList<Long>();
		// collection4表示它可以存放Integer或Integer的父类
		Collection<? super Integer> collection4 = null;
		collection4 = new ArrayList<Object>();

		// 泛型简单使用(Map.Entry是Map的一个内部类,表法Map中存在的一个对象)
		Map<String, Integer> testMap = new HashMap<String, Integer>();
		testMap.put("xiaobojava", 2);
		testMap.put("mengya", 3);
		testMap.put("zmx", 6);
		Set<Map.Entry<String, Integer>> entrySet = testMap.entrySet();
		for (Map.Entry<String, Integer> entry : entrySet) {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}

		// 自定义泛型
		String[] a = { "aa", "bb", "cc" };
		swap(a, 1, 2);
		Integer[] b = { 32, 45, 67 };
		swap(b, 1, 2);
		// 泛型中的类型不能为基本数据类型(如下就不行)
		int[] c = { 1, 3, 5 };
		// swap(c,1,2);

		Vector<Date> v1 = new Vector<Date>();
		// 由于泛型是由编译器实现的语法检查,编译成class文件后没有保留泛型信息,但可以根据Method获取
		Method applyMethod = GenericStudy.class.getMethod("applyVector",
				Vector.class);
		// getGenericParameterTypes()按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method
		// 对象所表示的方法的形参类型的。
		Type[] type = applyMethod.getGenericParameterTypes();
		// ParameterizedType extends Type
		ParameterizedType pType = (ParameterizedType) type[0];// applyVector只用一个参数
		// getRawType()返回 Type 对象,表示声明此类型的类或接口
		System.out
				.println("getRawType()方法:表示声明此类型的类或接口是:" + pType.getRawType());
		// getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。
		System.out.println("getActualTypeArguments()方法:实际类型参数的 Type 对象"
				+ pType.getActualTypeArguments()[0]);// Vector<Date>只用一个Date类型

	}

	public static void applyVector(Vector<Date> v1) {

	}

	public static void printCollection(Collection<?> collection) {
		for (Object obj : collection) {
			System.out.println(obj);
		}
	}

	/**
	 * 自定义泛型一个泛型方法
	 * 
	 * @param <T>
	 *            表示自己定义的一个泛型类型(T不能是基本数据类型)
	 * @param a
	 *            T类型的数组
	 * @param m
	 *            T类型的数组m位置
	 * @param n
	 *            T类型的数组n位置
	 */
	public static <T> void swap(T[] a, int m, int n) {
		T temp = a[n];
		a[n] = a[m];
		a[m] = temp;
	}

	/**
	 * 将某个类型的数组元素copy到这个类型集合
	 * 
	 * @param <T>
	 *            表示自己定义的一个泛型类型(T不能是基本数据类型)
	 * @param a
	 *            集合
	 * @param b
	 *            数组
	 */
	public <T> void copyArray2Collection(Collection<T> a, T[] b) {

	}

}

 

/**
 * 泛型DAO接口
 * 
 * @author 张明学
 * 
 */
public interface GenericDAO<E> {
	/**
	 * 持久化一个对象
	 * 
	 * @param entity
	 *            实体对象
	 */
	public void save(E entity);

	/**
	 * 根据主键查询一个实体对象
	 * 
	 * @param id
	 *            主键
	 * @return
	 */
	public E queryByPk(Integer id);

	/**
	 * 删除一个实体对象
	 * 
	 * @param entity
	 */
	public void delete(E entity);

	/**
	 * 删除一个实体对象
	 * 
	 * @param id
	 *            主键
	 */
	public void delete(Integer id);

	/**
	 * 修改一个实体对象
	 * 
	 * @param entity
	 */
	public void update(E entity);

	/**
	 * 查询一个实体对象集合
	 * 
	 * @return
	 */
	public List<E> queryList();

}

 

6
0
分享到:
评论
1 楼 mercyblitz 2010-05-31  
引用
# // 1.1 获取c1与c2的字节码看是否相同 
#         System.out.println("c1与c2的字节码是否相同:" + (c1.getClass() == c2.getClass()));// true 


在运行时擦鞋,模板参数类型不会保存在运行时。

引用

# // 泛型中的?通配符:表示任何类型,它与Object是有区别的如下所示: 
#         // collection1可以存放任保类型,而collection2则只能放在Object类型 
#         Collection<?> collection1 = new ArrayList<String>(); 
#         collection1 = new ArrayList<Integer>(); 
#         collection1 = new ArrayList<Object>(); 
#         Collection<Object> collection2 = new ArrayList<Object>(); 


java.lang.String is not java.lang.Object?不能放String吗?你确定?

引用

# // 自定义泛型 
#         String[] a = { "aa", "bb", "cc" }; 
#         swap(a, 1, 2); 
#         Integer[] b = { 32, 45, 67 }; 
#         swap(b, 1, 2); 
#         // 泛型中的类型不能为基本数据类型(如下就不行) 
#         int[] c = { 1, 3, 5 }; 
#         // swap(c,1,2); 


泛型的限制,不能申明为数组。

public static void swap(Object[] src,int a,int b){
...
}


这么申明就可以了,和泛型关系不大。




相关推荐

    Java基础篇:泛型.pdf

    该文档主要包括为什么使用泛型、在集合中使用泛型、自定义泛型结构、泛型在集成上的体现以及通配符的使用等内容

    java基础-泛型通配符

    java基础-泛型通配符

    Java 泛型通配符的一个实例

    * 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...

    JAVA第八章 泛型.pptx

    了解泛型,能够说出泛型的作用和优点 掌握泛型类,能够独立定义和使用泛型类 掌握泛型接口,能够独立定义和使用泛型接口 掌握泛型方法,能够独立定义并使用...01泛型基础 02泛型类 03泛型接口 04泛型方法 05类型通配符

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    学习和理解Java泛型的基本概念和语法; 实际项目中需要使用泛型来增加类型安全性和重用性的开发任务。 目标: 本代码资源的目标是帮助读者理解泛型的用法和优势,并通过实际的示例代码加深对泛型的掌握。读者可以...

    Java 基础泛型.pdf

    Java泛型概念 Java泛型是一种在编译时进行类型检查和类型推断的机制,它可以让我们编写更加通用、可重用的代码,提高了代码的可读性和可维护性,同时保证了类型安全。 Java泛型的核心思想是类型参数化,即在类、接口...

    Java泛型通配符

    NULL 博文链接:https://mydownload.iteye.com/blog/1330570

    Java泛型深入学习和总结 看这一篇就足够!

    2.4 泛型通配符: 三 限定类型变量 四 泛型中的约束和局限性 4.1 不能用基本类型实例化类型参数 4.2 运行时类型查询只适用于原始类型 4.3 泛型类的静态上下文中类型变量失效 4.4 不能创建参数化类型的数组 4.5 不能...

    java泛型常用通配符实例解析

    主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java中的泛型

    讲述泛型及泛型的子类型、通配符

    泛型的通配符.java

    泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码...

    详谈Java泛型中T和问号(通配符)的区别

    下面小编就为大家带来一篇详谈Java泛型中T和问号(通配符)的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java泛型总结.docx

    通配符:可以使用通配符来限制类型参数的范围。例如,List&lt;? extends Number&gt;表示一个可能是Number或其子类类型的列表。 类型推断:在Java 7及以上版本中,可以使用varargs和钻石操作符来推断类型参数。例如,List[]...

    java泛型例子

    java泛型例子 内涵泛型类,泛型接口,泛型方法,泛型通配符使用,泛型上界下界,泛型数组,嵌套泛型等,很详细。放入myeclipse可用,已测试。

    Generic_3(泛型限定(下限)-泛型限定(上限的体现)-泛型限定(下限的体现)-泛型限定(通配符的体现)-集合查阅的技巧)

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

    Java泛型:概念、用法与优势

    Java泛型是一种强大的特性,它使得我们可以编写更加通用、类型安全的代码。通过使用泛型类、泛型方法以及通配符,我们可以处理多种数据类型而无需重复编写代码,并且在编译时进行类型检查,避免了运行时的类型错误。...

    java中的泛型通配符的使用

    这是小编自己学习的心得,想通过这个平台对大家共享,希望大家前来评价一下,我及时改正,通配符这个是在泛型中使用的一个可以帮助大家更加方便简洁的去利用代码,它是其他泛型的一个总父类!

    java 面试常见问题整理

    Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? 常用的通配符有哪些? 你的项目中哪里用到了泛型? 反射 何为反射? 反射机制优缺点 反射的应用场景 注解 异常 Exception 和 Error 有什么区别? Checked ...

    Java中泛型通配符的使用方法示例

    主要介绍了Java中泛型通配符的使用方法,结合实例形式分析了java中泛型通配符的功能、语法及在泛型类创建泛型对象中的使用方法,需要的朋友可以参考下

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识 准备 Java 面试,首选.zip

    泛型&通配符详解 Java 反射机制详解 Java 代理模式详解 BigDecimal 详解 Java 魔法类 Unsafe 详解 Java SPI 机制详解 Java 语法糖详解 集合 知识点/面试题总结 : Java 集合常见知识点&面试题总结(上) (必看 ) Java...

Global site tag (gtag.js) - Google Analytics