关于Java擦除特性

 1 package thinkingInJava;
 2 /*
 3  * 模拟擦除
 4  */
 5 public class SimpleHolder {
 6
 7     private Object obj ;
 8     public void set(Object o ){
 9         obj = o ;
10     }
11     public Object get(){
12         return obj ;
13     }
14     public static void main(String[] args) {
15         // 如果该类使用了泛型参数,并且这个obj变量类型就是这个泛型参数表示的类型,那么当构造这个类的对象的时候会自动擦除类型信息,
16         // 对于有非泛型上界的变量类型转换成对应的非泛型上界,没有指定的则转换成Object
17         SimpleHolder demo = new SimpleHolder() ;
18         // 在运行时编译器丢到了所有的类型信息,所以set方法参数即使使用了泛型也不会起作用,
19         // 而是将其转换成器非泛型上界,但是在对象进入时(通过泛型设置值)会判断这个对象与泛型的一致性
20         demo.set("xxx") ;
21         // 当然获取时也是获取的对应非泛型上界类型的值。但是编译器会自动插入强制类型转换的代码
22         String x = (String) demo.get() ;
23     }
24 }
package thinkingInJava;
/*
 * 使用泛型版本
 */
public class GenericHolder<T> {
	private T obj ;
	public void set(T t ){
		this.obj = t ;
	}
	public T get(){
		return obj ;
	}
	public static void main(String[] args) {
		GenericHolder<String> demo = new GenericHolder<String>() ;
		//demo.set(new Object()); 虽然在运行时丢到了所有的类型信息,但是编译器仍然会保证传递进去的参数与泛型一致
		demo.set("hello ") ;
		String x = demo.get() ; // 出来时编译器自动插入强制类型转换代码
	}
}

  

时间: 2024-10-19 19:42:20

关于Java擦除特性的相关文章

跟王老师学Java三大特性(一):案例 QuickHit:需求分析

项目案例:QuickHit:需求分析 主讲教师:王少华   QQ群号:483773664 学习目标 学会用面向对象思想来进行需求分析 一.需求 根据输入速率和正确率将玩家分为不同级别 级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高 规定时间内完成规定次数的输入,正确率达到规定要求,则升级 玩家最高级别为6级.初始级别一律为1级 用户错误输入一次,游戏结束 二.面向对象分析 (一) 发现类 玩家(Player)类 游戏(Game)类 级别(Level)类 (二)发现类的属性 1.玩家

主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙

1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一个新特性. 主流的单元测试工具之-JAVA新特性-Annotation - groupthreetogether - group博客 2:元数据的简单介绍: @Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次. @After:使用了该元数据的方法在每个测试方法执行之后要执行一次.

Java Nio 特性学习(一)

Java NIO 特性学习 Java NIO 包含几个核心的组件: Channels Buffer Selectors Channels 可以理解为资源的一个流,通过这个流资源可以从Channel读取Data到一个Buffer中或者从一个Buffer中写入Data到Channel: Channel Implementations 集中Jdk7常用的Channel上线 FileChannel : 操作文件读取或者写入数据 DatagramChannel : 从一个网络UDP连接中读取或写入数据 S

Java多态特性:重载和覆写的比较

Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void main(String args[]){ int one = add(10,20) ; // 调用整型的加法操作 float two = add(10.3f,13.3f) ; // 调用浮点数的加法操作 int three = add(10,20,30) ; // 调用有三个参数的加法操作 Syst

java三大特性之封装

1.封装 封装概述:是指隐藏对象的属性和实现细节,仅仅对外提供公共访问方式. 好处: 隐藏实现细节,提供公共的访问方式 提高了代码的复用性 提高了安全性 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性隐藏,提供公共方法对其访问. 2.private关键字 private关键字是一个权限修饰分,可以修饰成员变量和成员方法,被private修饰的成员变量或成员方法只能在本类中使用. private最常见的应用:1.把成员变量用private修饰 2.提供对应的setter和getter方法.

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

几个有用的java 7特性

不等不承认,距离Java SE 9 的发布只有2个月不到的时间了.但本人很low,直到最近才开始在实践中使用Java SE 7 给程序员们带来的一些新特性.更别说Java SE  8的lambda表达式, Stream API等高级特性了.所以,在本人未来的几篇博客里,会陆续介绍从Java SE 7 开始的一些新特性.写这些内容其实也是为了巩固自己所学,因为作者本人也是一个learner,不是什么大牛.好了,废话到此为止,接下来作者将介绍几个很实用的java 7特性,文中若有用词不当或专业术语不

JAVA三大特性之二——继承

很多人在学习了JAVA以后,都会了解这个概念,而且继承也会在以后的开发中经常用到,但对于JAVA的继承特性,很多人都了解的不够深入,不够完整,当然这其中包括我,所以我就想抽点时间来整理一下JAVA继承特性方面的知识点. 以下面的代码为例: package staticTest; class ClassName { /**功能的介绍: * 作者: * 参数: * */ private String name; private String sex; private int age; private

java三大特性-----------------------多态

Java三大特性之多态 多态的定义:指允许不同类的对象对同一个消息做出响应,即同一消息可以根据发送对象的不同采用多种行为方式. 就我个人经历来说,对一个新人一开始就理解这个定义还是有一点难度的(可能是我比较蠢).我觉的还是用java的方式来理解可能会简单一点: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决