`
txidol
  • 浏览: 54801 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA泛型(代码级解释)

 
阅读更多
/**
 * Program  : LearnPattern.java
 * Author   : tanx
 * Create   : 2013-5-10 下午4:22:46
 *
 */
package pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author tanx
 * @version 1.0.0
 * @2013-5-10 下午4:22:46
 */
public class LearnPattern<K, V> {
	// 推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++
	// 模板的比较),并反映了大多数泛型类将具有少量类型参数的假定。对于常见的泛型模式,推荐的名称是:
	//
	// K —— 键,比如映射的键。
	// V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。
	// E —— 异常类。
	// T —— 泛型

	// Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,
	// tanx:显示的约定,而不是存在于程序员的头脑中,注释里,编译器帮我们杜绝错误,而不是运行BUG

	// 消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
	// 类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度

	public void put(K key, V value) {//使用类定义的   相同的类型

	}
	public V get(K key) {//使用类定义的   相同的类型
		return null;
	}

	//限定传入参数类型与返回类型相同,没在类定义泛型就要在方法名前加<T> ,T可以是其他字母
	public <T> T addTest(T value) { 
		return null;
	}

	public void testCase1() {
		LearnPattern<Integer, String> bb = new LearnPattern<Integer, String>();
		bb.put(1, "test"); // 一定传对参数
		String test = bb.get(1); // 无需类型转换
	}

	public void testCase2() {
		List<Integer> intList = new ArrayList<Integer>();
		intList.add(2);
		// List<Number> numberList = intList; // 无法转换 ,泛型不是协变的
		// numberList.add(2.0); // 如果能转换,那么这个2.0就能加,但实际intList不能加2.0
		List<?> numberList = intList; // 可以转成 ? 时常用于升级代码,消除转换警告,但请注意下面
		// numberList.add(2);// ? 无法添加
		System.out.println(numberList.get(0));// ? 能做查询
		numberList.clear();// ? 能做删除
	}

	// 多个参数约束
	public <T> T ifThenElse(boolean b, T first, T second) {
		return b ? first : second;
	}

	public void testCase3() {
		String s = ifThenElse(false, "a", "b");
		Integer i = ifThenElse(false, new Integer(1), new Integer(2));
		// 非法,不仅仅是口头约束,注释,或者直接运行时出错
		// String s = ifThenElse(b, "pi", new Float(3.14));
	}

	// 限制类型 //明白无误告诉别人,这个类里面属性test只能为Number子类
	public class testCase4<T extends Number> {
		private T test;
	}

	interface Collection<V> {
		boolean addAll(Collection<? extends V> c); // 不改变原来的语义,可添加集合及子类集合
		boolean removeAll(Collection<?> c); // 删除混合的集合类
	}

	// class Enum<E extends Enum<E>>
	// 类型参数 E 用于 Enum 的各种方法中,比如 compareTo() 或 getDeclaringClass()。
	// 为了这些方法的类型安全,Enum 类必须在枚举的类上泛型化。
	//
	// Enum<E> 这个是它本身 , E extends Enum<E> 表示是它本身的子类型
	// 因为枚举类实现了implements Comparable<E>  ,有如下方法:
	// public final int compareTo(E o) {
	// 		Enum other = (Enum)o;
	// 		Enum self = this;
	// 		if (self.getClass() != other.getClass() && // optimization
	// 		self.getDeclaringClass() != other.getDeclaringClass())
	// 		throw new ClassCastException();
	// 		return self.ordinal - other.ordinal;
	// }
	
	// public final Class<E> getDeclaringClass() {
	// 		Class clazz = getClass();
	// 		Class zuper = clazz.getSuperclass();
	// 		return (zuper == Enum.class) ? clazz : zuper;
	// }	
	//API解释
	//public final Class<E> getDeclaringClass()
	//返回与此枚举常量的枚举类型相对应的 Class 对象。
	//    当且仅当 e1.getDeclaringClass() == e2.getDeclaringClass() 时,
	//    两个枚举常量 e1 和 e2 的枚举类型才相同。(由该方法返回的值不同于由 Object.getClass() 
	//    方法返回的值,Object.getClass() 方法用于带有特定常量的类主体的枚举常量。)
	//返回:
	//与此枚举常量的枚举类型相对应的 Class 对象

	// public native Class<? super T> getSuperclass(); //Class的本地方法,返回该类的父类型
	public Class<? super Integer> testCase5() { // 返回Integer的父类类型
		return null;
	}
	
	//特殊效果演示
	abstract class Foo <T extends Foo<T>>{
		public abstract T subclassAwareDeepCopy();		
	}

	class Bar extends Foo<Bar> {
	    public Bar subclassAwareDeepCopy() {
	        Bar b = new Bar();
	        // ...
	        return b;
	    }	    	   
	}
	
	public class testCase5<T extends Number> {
		Bar b = new Bar();
    	Foo<Bar> f = b; // 子类和父类相互赋值
    	Bar bb2 = b.subclassAwareDeepCopy();
    	Bar bb3 = f.subclassAwareDeepCopy(); // 父类直接返回子类的实例,而且不用Cast
    	
    	Bar1 b1 = new Bar1();
		Foo1<Foo1> f1 = b1; // 子类和父类相互赋值
    	Bar1 b12 = b1.subclassAwareDeepCopy();
    	Bar1 b13 = (Bar1)f1.subclassAwareDeepCopy(); // 父类返回子类的实例,需要Cast
    	
    	Bar2 b2 = new Bar2();
    	Foo2 f2 = b2; // 子类和父类相互赋值
    	Bar2 b22 = b2.subclassAwareDeepCopy();
    	Bar2 b23 = (Bar2)f2.subclassAwareDeepCopy(); // 父类返回子类的实例,需要Cast
    	
	}

	//对比1  -----------------------------------------------------------------------
	abstract class Foo1<T> {
		public abstract T subclassAwareDeepCopy();		
	}

	//这里因为没有约束,所以我们可以随意填,你可能认为这填Bar1就不用转型了,
	//但那只存在于我们脑海中,如果是给别人提供api接口,显然要用 <T extends Foo<T>>
	class Bar1 extends Foo1<Foo1> {
	    public Bar1 subclassAwareDeepCopy() {
	        Bar1 b = new Bar1();
	        // ...
	        return b;
	    }	    	   
	}
	
	//对比2  -----------------------------------------------------------------------
	abstract class Foo2 {
		public abstract Foo2 subclassAwareDeepCopy();		
	}

	class Bar2 extends Foo2 {
	    public Bar2 subclassAwareDeepCopy() {
	        Bar2 b = new Bar2();
	        // ...
	        return b;
	    }	    	   
	}
	

}

分享到:
评论

相关推荐

    关于C#、java泛型的看法

    另一方面,Java的泛型类型擦除带来了一定的灵活性,使得旧的无泛型代码能够与新的泛型代码兼容,这对于维护大型遗留项目尤其有利。然而,这也意味着Java开发者需要额外注意类型转换的安全性,避免出现...

    java泛型指南 经典

    ### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...

    java泛型深入.pdf

    总之,深入理解Java泛型能够帮助开发者编写更安全、更健壮的代码。通过掌握泛型的原理和细节,开发者可以有效利用泛型来优化代码设计,提升程序的类型安全,同时在维持程序性能的同时简化代码。

    java泛型初探

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了类型安全性和代码可读性。泛型允许我们在类、接口和方法中使用类型参数,使得这些构造能够处理多种数据类型,而无需进行...

    java 泛型的使用 详细讲解

    ### Java泛型的使用详细讲解 ...Java泛型提供了一种强大且灵活的方式来编写类型安全的通用代码。通过使用泛型,不仅可以减少代码冗余,还可以提高程序的健壮性和可读性。希望本文能帮助你更好地理解和使用Java泛型。

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    Java泛型和集合是Java编程语言中的核心特性,它们极大地提高了代码的类型安全性和可读性,同时也简化了集合操作。本资料 "[Java泛型和集合].(Java.Generics.and.Collections).Maurice.Naftalin&amp;Philip.Wadler....

    JAVA泛型详解[参考].pdf

    总的来说,Java泛型是一个强大的工具,它提高了代码的可读性、类型安全性,并降低了运行时错误的可能性。通过理解和熟练使用泛型,开发者可以编写出更高效、更少bug的Java应用程序。在实际开发中,尤其是在处理数据...

    java 泛型

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入。泛型允许程序员在代码中使用类型参数,从而增加了代码的类型安全性和重用性。它能够帮助我们避免在运行时出现ClassCastException...

    Java泛型的深度解析:原理、应用与最佳实践

    Java泛型是Java 5中引入的一项强大特性,它允许在编译时提供类型安全,同时提高代码的重用性和可读性。泛型的本质是参数化类型,即在类、接口和方法中使用类型作为参数。本文将深入探讨Java泛型的工作原理、应用场景...

    Java泛型设计及其PECS原则解析

    使用场景及目标:帮助读者深入理解Java泛型的内在原理和高级用法,掌握PECS原则,从而能够在项目中更高效地运用泛型,提高代码质量和安全性。 其他说明:文章不仅提供了理论知识,还通过实例代码演示了泛型的实际...

    Java泛型与容器详细笔记.pdf (带书签)

    Java泛型与容器详细笔记涉及到Java编程语言中的两个重要概念:泛型(Generics)和容器(Containers)。容器主要包括Java集合框架中的各类集合类,如List、Set、Map等,它们用于存储和操作数据。泛型则提供了一种类型...

    java泛型BaseDao与BaseService

    总的来说,Java泛型BaseDao与BaseService是企业级Java开发中的重要概念,它们结合了泛型的优势,为数据访问和业务处理提供了灵活、安全的抽象基础。理解并熟练运用这些技术,将使你的Java开发能力更上一层楼。

    Java Generics and Collections (Java泛型与集合)

    通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们的高级特性和最佳实践,从而在实际项目中编写出更高质量的代码。这本书对于Java程序员来说是一份宝贵的...

    java泛型编程

    Java泛型编程的主要目的是提高代码的复用性和类型安全性。在没有泛型之前,开发者通常使用Object类型来存储各种数据类型的对象,这不仅需要频繁进行类型转换,而且容易引发运行时错误。引入泛型之后,可以通过在类、...

Global site tag (gtag.js) - Google Analytics