java泛型编程学习 笔记二:使用泛型的约束和局限性
来源:互联网 发布:mac装windows分区设置 编辑:程序博客网 时间:2024/05/16 05:28
我在java泛型编程学习 笔记一:为什么要使用泛型这篇博文中,曾经提到过java的"泛型机制"属于java的一种语法糖,它存在的目的是简化复杂的代码,以提高程序的安全性。
实际上java虚拟机没有任何泛型对象——所有的对象都属于普通类对象,所以说不管我们在任何时候定义一个泛型类型,虚拟机都会为其提供一个“原始类型”。
“原始类型”名称:删去类型变量之后的泛型类型名称。Result<T>的原始类型是Resul
“原始类型”中类型参数的“擦除”:将类型参数替换为限定类型,无限定类型的替换为Object。
下面我们探讨一下java泛型机制使用过程中的一些约束和局限性,这些限制大多是由于类型擦除而引起的。
约束一:不能用基本类型实例化类型参数
java有byte、short、int、long、float、double、char、boolean,8中基本数据类型,在提供类型参数时,不能使用基本数据类型,
因为类型擦除之后,没有限定类型的类型参数会被Object类型替换,而Object不能存储基本数据类型。
比如我们不能定义Result<int> 类型,而我们可以提供基本类型的包装器类型Result<Integer>,因为Integer的父类是Object,这样Integer就可以转换成Object类型了。
约束二:运行时类型检查只适用于原始类型
/** * 对于泛型所有的类型检查只产生原始类型 * @author Administrator */public class ResultTest {public static void main(String [] args){Result<String> result_Str = new Result<String>("1","success");Result<Integer> result_Inte = new Result<Integer>(0,-1);// 这是对确切的泛型类型使用instanceof是错误的if(result_Str instanceof Result<String>) {System.out.println("yes");}// 只能对原始类型使用instanceofif(result_Str instanceof Result) {System.out.println("yes");}// 对于泛型所有的类型检查只产生原始类型if(result_Str.getClass() == result_Inte.getClass()){System.out.println("same Class");}}}
约束三:不能创建参数化类型的数组
Result<String> [] Rstr = new Result<String>[5];// Error
擦除类型变量之后 Rstr的类型就是Result[],这样就丢失元素的类型信息,
数组在创建时必须知道元素类型,如果试图存储其他类型的元素,就会抛出一个ArrayStoreException异常。
需要说明的是,只是不允许创建这些类型的数组,而声明类型为Result<String>[] 的变量仍然是合法的,只不过不能用new Result<String>[5]来初始化这个变量。
约束四:不能在静态域或静态方法中引用类型变量
/** * 不能在静态域或静态方法中引用类型变量 * @author Administrator */public class ResultStatic<T> {private T code;//Errorprivate static T message;//Errorpublic static T getTestCode(){}}类的静态域和静态方法是属于类而不属于对象,我们知道类型擦除之后ResultStatic<String>和ResultStatic<Integer>都会变成原始类型ResultStatic类型,如果这个类能正常定义的话,这两个ResultStatic<String>和ResultStatic<Integer>类所拥有的静态域和静态方法就会冲突。
- java泛型编程学习 笔记二:使用泛型的约束和局限性
- Java泛型的约束和局限性
- java泛型使用时的约束与局限性
- Java泛型解析(04):约束和局限性
- Java 泛型 泛型的约束与局限性
- 泛型的约束与局限性
- java泛型程序设计——约束与局限性
- Java泛型的局限性
- 泛型的局限性
- 【Java学习笔记】37:泛型使用时要注意的约束
- C++学习笔记十六-模板和泛型编程(二)
- C#泛型学习笔记之一(约束)
- Java 泛型类约束与局限性
- Java 泛型类约束与局限性
- java泛型II-泛型中存在的约束与局限性
- 泛型类的约束与局限性
- java泛型约束和限定
- Java 泛型学习笔记(二)
- 【计算机历史的考古】
- VS中“转到定义”提示“未能找到符号”的解决方法
- java用split分割字符串
- vs2013配置OpenGL开发环境
- scala数据结构和算法-08-堆排序
- java泛型编程学习 笔记二:使用泛型的约束和局限性
- SQL Server 实现单列累积乘
- android之App的格式设置
- git进阶之--merge的5种策略
- VPN连接不上解决
- session是什么
- Servlet技术浅析(二)之HttpServlet抽象类
- JdbcTemplate简介
- jQuery实现图片左右出现和隐藏动画(腰封)