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

深入了解Java泛型(五) -- 类型令牌

阅读更多
可以考虑下这样的场景:假设我的一个应用中有很多类都是"无状态"的,并且实例化一个这种类是很费资源的,更糟的是发现这些类没有一个是单例的,这个时候可以考虑在外部编写一个单例的缓存,使用这个缓存来维护这些类的实例。

考虑到类型安全性,我想使用泛型去实现这个缓存,但是泛型一般只能有有限的类型参数,比如Set和List有1个,Map有2个,这个时候就可以考虑不将缓存泛型化,而将缓存的键泛型化。说了这么多还是看看具体的代码吧。

public class SingletonClassCache {
	private static Map<Class<?>, Object> cache = new HashMap<Class<?>, Object>();

	public static synchronized <T> void put(T t) {
		cache.put(t.getClass(), t);
	}

	public static synchronized <T> T get(Class<T> clazz) {
		return clazz.cast(cache.get(clazz));
	}
}


这个类很简单,SingletonClassCache并没有泛型化,而是把内部的静态成员cache的键变成了Class<?>类型,这样就可以通过它的两个泛型方法去实现安全的缓存单例了。

public class TypeTokenTester {

	public static void main(String[] args) {
		String s = new String("string");
		SingletonClassCache.put(s);
		Integer i = new Integer(1);
		SingletonClassCache.put(i);

		System.out.println(s == SingletonClassCache.get(String.class));
		System.out.println(i == SingletonClassCache.get(Integer.class));
	}

}


运行结果当然都是true,说明引用指向的都是同一个对象。

上边的这种用法就是所谓的类型令牌了。通过这种方式,可以增加泛型的灵活性,但是这种方式也有一个很大的缺点。比如List<String>这种泛型类型的对象是不能通过类型令牌保存的,因为泛型类型在运行时是会擦除泛型信息的,List<String>.class是会报出语法错误的,这样其实也更安全,因为List<String>和List<Integer>其实用的是同一个Class对象。
分享到:
评论
1 楼 wangluo19 2011-07-06  
读了博主的深入泛型1到5这五篇文章,加深了我对泛型的理解;
理解了?表示的含义
理解了泛型类,实例化类的时候会替换泛型参数
理解了泛型方法,泛型方法的替换与泛型类相同,注意到了E对于泛型来讲是个符号,是在方法的static后面声明的。

博主文章给力啊

相关推荐

    Java1.5泛型指南中文版

    Java泛型的一个重要特点是类型擦除。这意味着在编译之后,所有的类型参数信息都会被擦除,只保留原始类型。例如,`List&lt;Integer&gt;`和`List&lt;String&gt;`都会被擦除为`List`。 #### 在老代码中使用泛型代码 对于那些尚未...

    Java泛型指南

    ### Java泛型指南:深入理解与应用 #### 泛型概览 Java泛型是Java 5.0引入的重要特性之一,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。在Java中,泛型是一种在...

    Java Generics Tutorial

    本教程旨在深入浅出地介绍Java泛型的基本概念和用法。即便你对其他语言(如C++模板)中的类似特性有所了解,你也会发现Java泛型既有相似之处,也有其独特之处。对于初学者而言,没有先入为主的观念将有助于更好地...

    java8英文文档

    - **类型擦除**:解释了Java泛型中的类型擦除机制及其对程序的影响。 通过以上总结可以看出,《Java 8 英文文档》是一份全面且详细的文档,它不仅包含了Java 8的基础知识,还深入探讨了许多高级特性,对于初学者和...

    Java 11 语言规范文档

    这份文档详细说明了Java语言的各个方面,从基本的语法和数据类型到更高级的概念,如泛型和继承等。它是由James Gosling、Bill Joy、Guy Steele、Gilad Bracha、Alex Buckley和Daniel Smith等人编写的,它是Java语言...

    The_Java_Language_Specification_Java_SE_8_Edition

    - **前言**:本书为Java SE 8版本提供了详细的规范说明,旨在帮助开发者深入理解Java语言的各种特性及其使用方法。 - **组织结构**(1.1节):本书按照逻辑顺序对Java语言进行了分章节介绍,每一部分都紧密相连,...

    Java语言规范十一版

    10. **类型擦除**:解释了Java运行时如何处理泛型信息,以及为何需要类型擦除。 11. **可再现类型**:说明了某些泛型类型可以在编译时完全确定的情况。 12. **原始类型**:讨论了没有显式指定类型参数的泛型类的使用...

    Java高级应用和Struts的入门笔记

    - **泛型**:在`DAY01【泛型笔记】.docx`中,你将学习到泛型是如何帮助我们在编译时就检查类型安全,并消除运行时的类型转换异常。泛型允许我们在类、接口和方法中定义类型参数,增强了代码的重用性和安全性。 - ...

    jackson-core-2.7.0.jar和源码

    4. **类型处理**: Jackson支持处理各种复杂的Java类型,包括泛型、集合、数组、自定义类型等,同时还支持类型注解以进行更细粒度的控制。 5. **性能优化**: Jackson 2.7版本进行了大量的性能优化,包括更快的序列化...

    阿里巴巴Java开发手册v1.2.0.pdf

    通过以上详细的知识点梳理,《阿里巴巴Java开发手册》不仅强调了Java开发的基本规范,还深入探讨了数据库设计、工程结构规划以及安全性等多个方面,旨在帮助开发者构建高质量、高效率的软件产品。

    jackson2.7-jar

    3. **类型绑定与泛型**:Jackson 2.7改进了对泛型的支持,能够更准确地处理泛型类型,从而在反序列化时能正确恢复原始的类型信息。 4. **流式API**:`JsonParser`和`JsonGenerator`是Jackson的核心流式API,它们...

    commons-collections-3.2.1.rar代码及原jar文件

    10. **类型安全的泛型支持**:虽然Java 5引入了泛型,但Apache Commons Collections在3.2.1版本时仍然对旧版本的Java兼容,通过类型令牌(TypeToken)机制实现了类型安全。 总的来说,Apache Commons Collections ...

    Gson工具类

    - 创建了一个泛型列表 `List&lt;JavaBean&gt;`,并使用泛型类型令牌 `TypeToken` 来指定列表的类型。 - 将列表转换为JSON字符串。 #### 总结 通过以上介绍,我们可以看到Gson提供了一种非常简洁且强大的方式来处理JSON与...

    100 Recipes for Programming Jav - Jamie Munro

    ### 《100 Recipes for Programming Java》- Jamie Munro ...以上只是本书中部分食谱的简要概述,每个章节都提供了深入的技术细节和实用的代码示例,对于希望提高Java编程技能的开发者来说,是一本非常有价值的参考书。

    2018年JAVA架构师面试后的问题汇总-word范文 (2页).pdf

    1. **JDK1.5新增功能**:JDK1.5引入了泛型、自动装箱/拆箱、枚举类型、变长参数、可变数组、枚举注解、增强的for循环(foreach)、静态导入、try-with-resources语句等,这些特性提高了代码的可读性和效率。...

    2018年JAVA架构师面试后的问题汇总-word范文 (2页).docx

    【JAVA架构师面试知识点】 ...以上知识点涵盖了Java架构师面试中常见的技术点,对于深入理解和掌握Java技术体系具有重要价值。在实际工作中,这些知识点不仅用于应对面试,更能帮助提升系统的稳定性和性能。

    百度面经1

    12. **泛型**:Java泛型提供类型安全,允许在编译时检查类型。 13. **反射**:Java反射机制可以在运行时动态获取类的信息并操作类的对象。 14. **JVM内存区域**:包括堆、栈、方法区、程序计数器、本地方法栈等,...

    Spring-API+中文帮助文档.rar

    Spring框架是中国乃至全球开发者广泛使用的Java企业级应用开发框架,尤其在微服务、云计算领域有着不可或缺的地位。"Spring-API+中文帮助文档.rar"这个压缩包包含的资源对于学习和掌握Spring框架至关重要。其中,API...

    sonarqube.cpd.false.positives:sonarqube中重复代码的误报示例

    在Java开发环境中,误报问题可能更为复杂,因为Java语言的特性如继承、接口、泛型等可能导致看似重复但实际上正常的代码结构。了解并正确处理这些问题,可以帮助开发团队更有效地利用SonarQube提升代码质量和可维护...

Global site tag (gtag.js) - Google Analytics