java泛型编程学习 笔记二:使用泛型的约束和局限性

原创 2017年01月03日 16:45:04

我在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");
		}
		
		// 只能对原始类型使用instanceof
		if(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;
	
	//Error
	private static T message;
	
	//Error
	public static T getTestCode(){
		
	}
}
类的静态域和静态方法是属于类而不属于对象,我们知道类型擦除之后ResultStatic<String>和ResultStatic<Integer>都会变成原始类型ResultStatic类型,如果这个类能正常定义的话,这两个ResultStatic<String>和ResultStatic<Integer>类所拥有的静态域和静态方法就会冲突。

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

夯实JAVA基本之一——泛型详解(2):高级进阶

前言:被温水煮惯了,梦想的东西总是不敢于尝试,失败了又怎样,最多从头来过。上一篇给大家初步讲解了泛型变量的各种应用环境,这篇将更深入的讲解一下有关类型绑定,通配符方面的知识。一、类型绑定1、引入我们重...

Java泛型编程使用总结

泛型的使用使得Java程序更加的灵活,使开发者能够尽早发现问题。1. 泛型介绍泛型是一种特殊的类型,它能够让程序员把指定类型的工作推迟到类的声明并实例化类或者方法的时候。简单来说,也叫参数化类型,直接...

Java泛型编程最全总结

1介绍 Java泛型编程是JDK1.5版本后引入的。泛型让编程人员能够使用类型抽象,通常用于集合里面。下面是一个不用泛型例子:   Java代码   List myIntLis...

牛刀小试 - Java泛型程序设计

序言 一般的类和方法,只能使用具体的类型:要么是基本数据类型,要么是自定义的类。 如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。                     ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java泛型程序设计——定义简单泛型类+泛型方法

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识;【1】一个泛型类: 就是具有一个或多个类型...

泛型--Java使用泛型编程提取类名上T类型

转载自:http://blog.csdn.net/ykdsg/article/details/5472591   很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的clas...

centos系统下安装daemontools详细指南

之前在centos5系列系统下安装完daemontools后,在/etc/inittab中会自动加入一行"SV:12345:respawn:/command/svscanboot /etc/init...

redis列表类型list如何一次返回多个值并删除这些值

redis的列表类型list是一个常用的数据类型,但是这个类型并不支持一次性返回多个值并删除这些已经返回的值。...

java泛型使用时的约束与局限性

不能使用基本类型实例化类型参数运行时类型查询只适用于原始类型java if(a intanceof Pair) //ERROR java Pair p = (Pair) a...
  • wolf2s
  • wolf2s
  • 2017年12月07日 16:52
  • 9
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java泛型编程学习 笔记二:使用泛型的约束和局限性
举报原因:
原因补充:

(最多只允许输入30个字)