`

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泛型的一个重要应用是在集合框架中。在JDK 1.5之前,Java集合类框架使用Object作为元素类型,这意味着集合可以存储任何类型的对象。然而,这种设计导致在从集合中获取元素时必须进行类型转换,这个过程是繁琐且...

    泛型讲解 类型通配符

    类型通配符: 1. 定义:使用问号 `?` 作为类型通配符,例如 `List&lt;?&gt;`。 2. 作用:表示各种泛型的父类,例如 `List&lt;String&gt;` 和 `List&lt;Integer&gt;` 都是 `List&lt;?&gt;` 的子类。 3. 限制:不能向类型通配符集合中添加元素...

    JAVA第八章 泛型.pptx

    5. 类型通配符:类型通配符用于表示一个未知的类型边界,例如`?`。可以指定类型通配符的上限(如`&lt;? extends Number&gt;`)和下限(如`&lt;? super Integer&gt;`),来限制可以接受的类型范围。 泛型带来的好处主要包括: -...

    关于java基础的泛型的练习

    - 泛型通配符:例如`?`,表示任意类型。`List&lt;?&gt;`表示可以容纳任何类型的列表。 - 上界通配符:`&lt;? extends T&gt;`限制了只能传入T或T的子类类型的对象。 - 下界通配符:`&lt;? super T&gt;`限制了只能传入T或T的父类类型...

    java基础-泛型通配符

    java基础-泛型通配符

    Java泛型通配符

    Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

    泛型&通配符常见面试题总结

    泛型和通配符是Java编程中的重要概念,它们在处理类型安全和代码复用方面起着关键作用。本文将深入探讨这两个主题,并提供一些常见的面试题,帮助开发者理解和掌握这些知识点。 首先,我们来理解泛型。泛型是Java 5...

    jdk5.zip_java 泛型_jdk5 泛型_泛型

    Java泛型在运行时会被擦除,因此泛型不提供运行时的类型检查。所有的泛型类和方法都会有一个没有泛型的等价形式,这个过程称为类型擦除。 4. **通配符的使用**: - 无界通配符:`?`,表示类型参数可以是任何类型...

    Java1_5泛型.zip

    5. 通配符:在某些情况下,我们不需要知道确切的类型,而是希望接受任意类型的对象。这时可以使用通配符,如 `?`。例如,`acceptList(List&lt;?&gt; list)` 方法可以接受任何类型列表。 6. 类型擦除:Java 泛型的实现基于...

    java基础泛型 学习全文件

    Java基础泛型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。在Java中,泛型的主要目标是提高效率,避免运行时的类型转换,并且在编译时期就能发现...

    Java中的泛型

    ### Java中的泛型 #### 什么是泛型? 泛型是Java SE 5.0中引入的一项新特性,它允许在程序设计中使用参数化类型,从而实现类型安全的集合类和其他容器类。在使用泛型之前,Java程序员通常依赖于Object类型作为通用...

    博客《反射(2):泛型相关周边信息获取》对应源码

    泛型是Java编程语言的一个重要特性,它引入了类型安全,提高了代码的可读性和可维护性。通过反射与泛型相结合,开发者可以动态地操作带有泛型的类和对象,这对于框架设计和复杂业务逻辑尤为有用。 首先,我们要理解...

    Generics_in_the_Java_Programming_Language译文

    Java 泛型详解 Java 中的泛型是 Java 5(JDK 1.5)中引入的一项新特性,旨在解决类型安全和代码重用的问题。泛型允许程序员对类型进行抽象,使得代码更加灵活和可维护。 泛型的优点: 1. 类型安全:泛型可以在...

    学士后Java集合框架和泛型课后习题答案

    5. **泛型通配符**:?通配符用于表示任意类型。例如,`List&lt;?&gt; list = new ArrayList();` 这里的?表示list可以接受任何类型的列表。上限通配符`&lt;? extends T&gt;`和下限通配符`&lt;? super T&gt;`则限制了可以使用的具体类型...

    java泛型技术之发展

    4. 通配符:?表示任意类型,如`List&lt;?&gt;`表示包含任意类型的列表。上界通配符`? extends T`表示类型为T或T的子类,下界通配符`? super T`表示类型为T或T的父类。 三、类型擦除 Java泛型的实现基于类型擦除。在编译...

    Java集合框架及泛型

    4. **基本类型参数**: Java泛型不能直接接受基本类型(如int、char),但可以通过创建对应的包装类(如Integer、Character)来使用。 5. **协变与逆变**: 在泛型中,类型参数的使用会影响类型安全。比如,List&lt;? ...

    java5泛型新特性 pdf

    Java 5 泛型是Java编程语言中一个重要的里程碑,它引入了类型安全的集合,大大增强了代码的可读性和可维护性。泛型在Java 5中首次亮相,为开发者提供了一种方式来限制集合(如List、Set、Map等)中可以存储的数据...

    Java 理论和实践 了解泛型

    5. 泛型通配符:`?`代表任意类型,但通常有上下界限制,如`List&lt;?&gt; list`表示列表可能包含任意类型的元素,而`List&lt;? extends Number&gt; list`则表示列表中的元素必须是Number或其子类。 6. 级联泛型:如`List...

Global site tag (gtag.js) - Google Analytics