Java重要技术(22)泛型之参数化类型的本质

1.1. 参数化类型的本质

Java参数化类型相对于C++的参数化类型而言,有本质区别。前者只是编译器的类型检查的一种手段,而后者则是真正的不利于原始类型的新的类型。

public class GenericParameterTest3 {

static class  Hello{}

static class  World{}

static class  Generic<T>{}

public static void main(String[] args) {

//三者编译后的类型完全相同。

Generic  g1 = new Generic();

System.out.println("Generic:" +  g1.getClass());

Generic<Hello>  g2 = new Generic<Hello>();

System.out.println("Generic<Hello>:" +  g2.getClass());

Generic<World>  g3 = new Generic<World>();

System.out.println("Generic<World>:" +  g3.getClass());

//g1等于g2, g1等于g3

System.out.println(g1.getClass() == g2.getClass());

System.out.println(g1.getClass() == g3.getClass());

//编译错误。

//Generic<Hello>  hello = new Generic<World>();

}

运行后发现,不同的类型参数组成的泛型类型,其class的类型都和原始类型的class的类型完全相同。不论实例化多少个泛型类型,编译后只会产生唯一一个class文件,加载后也只有唯一一个Class对象。

运行结果如下:

Generic:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic

Generic<Hello>:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic

Generic<World>:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic

true

true

Java的参数化类型的上述本质决定了不同类型参数组成的参数化类型之间可以进行强制类型转换。

时间: 2024-10-23 04:23:22

Java重要技术(22)泛型之参数化类型的本质的相关文章

Java重要技术(20)泛型之参数化类型的特点

1.1. 参数化类型的特点 参数化类型有以下特点: (1)参数化类型和没有类型参数的原始类型在编译后没有本质区别. (2)类型参数不同的两个参数化类型,不能混用. public class GenericParameterTest { //参数化类型T,可以为String,Integer等引用类型. static class Sample<T> { //不带参数的构造函数. public Sample(){ this.obj = null; } public Sample(T obj){ th

Java重要技术(21)泛型之参数化类型的特点(续)

1.1. 参数化类型的特点2 类型参数不同但是存在继承关系的两个参数化类型,仍然不能混用.类型参数的继承关系不能推导出参数化类型具有继承关系. public class GenericParameterTest2 { static class Base {} static class Derived extends Base {} static class Generic<T>{} /** * @param args */ public static void main(String[] ar

Java重要技术(24)泛型之使用反射访问参数化类型

1.1. 用反射访问参数化类型 使用反射机制可以获取到一部分参数化类型有关的信息. public class GenericParameterTest5 { static class Base{} static class Generic<T extends Base>{ public T work( List<T> list){ return list.get(0); } public T work( T obj){ return obj; } } public static v

Java重要技术(19)泛型之泛型的使用方法

1.1. 泛型的用法 参数化类型比如Sample<T>中的类型参数T可以用于构造函数的参数的类型,方法的返回值的类型,画着方法的参数的类型,属性字段的类型等. public class GenericParameterTest { //参数化类型T,可以为String,Integer等引用类型. static class Sample<T> { public Sample(T obj){ this.obj = obj; } //参数化类型作为返回值的类型. public T wor

Java重要技术(23)泛型之问号通配符

1.1. 问号通配符 在类型参数中使用问号通配符,可以有三种不同的用法: (1)Generic<?> 表示类型参数为任意对象类型. (2)Generic<? extends B>表示类型参数为B或者B的派生类. (3)Generic<? super B>表示类型参数为B或者B的父类. static class A {} static class B extends A{} static class C extends B{} static class Generic&l

Java基础笔记:泛型

内容:Java中的泛型 优秀文章:新浪博客-海洋星球:http://blog.sina.com.cn/s/blog_44c1e6da0100cus3.html书籍:细说Java.疯狂Java讲义 说明:泛型是于Java SE1.5添加的新特性:泛型的本质是参数化类型,简单来说就是将泛型看作一个或多个参数,使用这个参数的代码片段可以由任何具体类类型的参数来替换:泛型的参数类型只能是类类型,不能是简单类型(简单类型是指不能再简化的编程语言内置数据类型,java中有实数-float-double.整数

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中 package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1.向集合添加任何类型对象 * 2.从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

Android技术22:Android中AIDL

在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信.然后在进程之间则需要借助Binder实现IPC调用.Android进程通信框架:服务端,客户端,Linux binder驱动.Binder驱动成为连接两端的桥梁.我们首先通过aidl语言实现一个简单的多进程通信.具体实现步骤如下: 1.定义aidl文件 IService.aidl,定义一个接口,test() ,不包含负责的类和数据. 1 package com.demo.ipc; 2 3