`
刘琛颖
  • 浏览: 50003 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

深入了解Java泛型(一) -- 泛型与原生态类型

阅读更多
Java1.5引入了泛型之后,为程序的安全性又增加了一个新的保障,减少了发生运行时类型错误的可能性,这篇文章并不是要讲述泛型的基本操作,而是要了解一些在进行泛型处理时可能会遇到的一些稍微复杂些的问题。在第一篇文章中,主要了解一些泛型和原生态类型的关系问题。

何为原生态类型(raw type),就是不带有类型信息的"泛型",比如相对于List<Integer>的List就是原生态类型。实际上原生态类型的List与JDK1.5之前的版本是相同的。

很明显可以得出的结论是原生态类型是不安全的,例证我这里也不给出了,这里只会说一些泛型的一些特点和与原生态类型之间的联系。

1. 无限制的通配符类型
在泛型中,有一种无限制的通配符类型,比如List<?>,这里的"?"就代表了对这个List中的元素没有限制或者根本不关心。在提供了方便性的同时它也有一个很大的限制,那就是使用了无限制通配符类型的泛型比如List<?>,是不能添加任何元素进去的。
比如:

Java代码
	public void testMethod(Set<?> set){
		set.add("e");
	}


是不会通过编译的。因为通过这种方式很容易就会破坏泛型的类型限制。
但是,也有例外,null是可以插入进去的。

2. 泛型信息的运行时擦除
Java中的泛型有一个这种特点,它的泛型信息在运行时是会擦除掉的,也就是说只有在编译期,泛型才会发生作用,真正运行的时候List<Integer>和List也是没有区别的,不过这也足够了。

因为泛型的这个特点,泛型与原生态类型就有了2个联系:
(1) 类的字面量只能用原生态类型而不是泛型。
比如,List.class,Map.class。你可能也没见过List<Integer>.class的写法吧?因为这种是不合法的。
(2) instanceof操作符只能跟原生态类型。
比如写一个下面的方法:

Java代码
	public static void testMethod(Collection<?> collection) {
		if (collection instanceof Set) {
			Set<?> s = (Set<?>) collection;
			for (Object e : s) {
				System.out.println(e);
			}
		}
	}

	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("1");
		set.add("2");
		set.add("3");
		set.add("4");
		set.add("5");
		testMethod(set);
	}


这里instancdof后面跟的就是原生态类型,而确定了类型之后就要将其转换为相应的泛型类型。
分享到:
评论

相关推荐

    Java核心知识1:泛型机制详解.pdf

    Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型)。...

    java与C#区别详细介绍1.docx

    C#与Java是两种广泛使用的编程语言,它们在许多方面都有所不同,包括语法、类型系统、内存管理、面向对象特性以及平台支持。以下是对这两种语言主要区别的详细说明: 1. 类型系统: - Java只有带符号的整数类型,...

    j2objcJava转成Objective-C的用于移植Android库到iOS

    这个工具为跨平台开发提供了一个独特的解决方案,特别是对于那些已经拥有大量Java代码基础的团队,想要扩展到iOS生态系统时,j2objc 提供了一条捷径。 首先,我们来理解一下Java和Objective-C之间的差异。Java是一...

    高清Java核心技术第一二卷

    8. **泛型与类型推断**:介绍了泛型的使用,提高了代码的类型安全性和重用性。 9. **并发编程**:涵盖了线程的基本操作,以及同步、锁和并发集合的使用。 10. **注解与反射**:解析了注解的作用,以及如何使用反射...

    practical java(中文版)

    1. **基本语法与数据类型**:Java提供了丰富的数据类型,包括原始类型(如int、float)和引用类型(如类、接口)。书中会详述每种类型的用法,以及它们在程序设计中的作用。 2. **面向对象编程**:Java是纯面向对象...

    java大神进阶之路.pdf

    - 高级特性:了解Java的反射、代理、泛型、枚举、正则表达式等高级特性。 - 网络编程:掌握网络通信协议原理、Socket编程和WEB服务器的工作原理。 - JDK版本特性:关注JDK1.5、JDK1.6、JDK1.7、JDK1.8等各版本的新...

    A port of LINQ (Language-Integrated Query) to Java.zip

    Java版也需要保持这一特性,可能通过泛型和静态类型检查来实现。 5. **流式编程与延迟执行**:LINQ的查询表达式是延迟执行的,这意味着直到真正需要结果时才会执行查询。在Java中,这可以通过Stream API的特性来...

    《.NET For Java Developers :Migrating To C# 》电子书

    这本书由Addison-Wesley出版社出版,是英文版的电子书,对于希望深入理解.NET框架和C#语言的Java程序员来说,是一个宝贵的资源。 本书的核心内容涵盖了以下几个方面: 1. **.NET框架概述**:首先,书中会介绍.NET...

    kotlin学习手册

    ### Kotlin学习手册知识点详解 #### 一、Kotlin概述 ...以上内容涵盖了Kotlin学习手册中的主要知识点,从基础知识到高级特性都有涉及,适合不同阶段的学习者深入了解和掌握Kotlin语言及其应用场景。

    CSharp_深入浅出全接触

    【C# 深入浅出全接触】 C#是一种由Microsoft公司开发的现代编程语言,它结合了C++的强类型系统和VB的简洁易用性,特别为...学习C#,不仅能够掌握一种强大且现代化的编程语言,还能深入了解.NET生态系统的深度和广度。

    JVM基础JVM基础JVM基础

    - **Java SE 5.0 (2004)**: 引入了泛型、枚举类型、自动装箱等语言级别的改进。 - **Java SE 6 (2006)**: 增强了Swing组件、JPDA调试工具等。 - **Java SE 7 (2011)**: 引入了NIO 2.0、字符串开关语句等新特性。 ...

    kotlin-docs.pdf

    Kotlin 是一门现代、面向对象且类型安全的语言,它在设计之初就考虑到了与Java生态系统的无缝集成。该语言的主要目标是提高开发者的生产力,使得代码更加简洁、表达力更强,并且易于维护。 #### 使用Kotlin进行...

    java反编译 JAD插件

    通过学习和掌握Java反编译及JAD插件的使用,开发者可以更深入地了解Java技术,提高自我学习和解决问题的能力,同时也为参与到开源社区的贡献和学习提供了便利。因此,对于Java开发者来说,理解和掌握如何利用JAD这样...

    Google_Guava_Collections_使用介绍.pdf )

    总之,Guava Collections通过其丰富的功能和对Java新特性的深入利用,极大地提高了Java开发者的工作效率,简化了复杂数据结构的操作,成为了Java生态中不可或缺的一部分。无论是初学者还是经验丰富的开发者,掌握...

    Thinking_in_Java_4(中文版)

    《Thinking in Java 4(中文版)》是一本专注于Java语言的经典学习书籍,适合对Java有一定基础或了解的读者深入研读。尽管书名中带有“中文版”字样,但这是一本影印版,并不推荐给初学者直接阅读。影印版通常意味着...

    Java知识体系+ 总结+面试

    Java知识体系是一个全面而深入的学习领域,涵盖了从基础到高级的各种概念和技术。以下是对标题和描述中提及的知识点的详细说明: 1. **Java体系总结1**:这部分内容可能包括了Java的基础概念,如变量、数据类型、...

    JAVA 软件开发 Eclipse 中文教程 完美版

    **Java软件开发与Eclipse IDE** Java是一种广泛使用的高级编程语言,以其跨平台、面向对象的特性而闻名。它在企业级应用、Android移动开发、Web应用和大数据处理等领域都有广泛应用。Eclipse是一款强大的集成开发...

Global site tag (gtag.js) - Google Analytics