【ThinkingInJava】37、关于泛型数组

/**
* 书本:《Thinking In Java》
* 功能:由于有了擦除,数组运行的时候类型就只能是Object[]。如果我们立即将其转型为T[],那么在编译期该数组的实际类型就将会丢失,
* 而编译器可能会错过某些潜在的错误检查。所以我们最好在集合内部使用Object[],然后当你使用数组元素的时,添加一个对T的转型。
* 文件:GenericArray2.java
* 时间:2015年4月19日09:38:19
* 作者:cutter_point
*/
package Lesson15_generices;

public class GenericArray2<T>
{
	private Object[] array;
	//构造函数,创建一个一定长度的泛型数组
	public GenericArray2(int sz)
	{
		array = new Object[sz];	//创建的类型是Object类型的
	}

	//给数组指定的位置赋值
	public void put(int index, T item)
	{
		array[index] = item;

	}

	//获取指定位置的值
	@SuppressWarnings("unchecked")
	public T get(int index)
	{
		return (T)array[index];	//一个一个地取,一个一个地转没问题,但是不能取出一个数组,应为java对数组的保存是Object类型的
	}

	//获取这个泛型数组
	@SuppressWarnings("unchecked")
	public T[] rep()
	{
		return (T[])array;
	}

	public static void main(String[] args)
	{
		//创建一个10位的数组
		GenericArray2<Integer> gai = new GenericArray2<Integer>(10);
		//放入1到10
		for(int i = 0; i < 10; ++i)
			gai.put(i, i);
		for(int i = 0; i < 10; ++i)
			System.out.print(gai.get(i) + " ");
		System.out.println();

		//取出这个数组
		try
		{
			Integer ia[] = gai.rep();	//调用这个函数的时候,这个还是尝试吧Object[]转化为T[],这个任然不正确
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}

输出:

0 1 2 3 4 5 6 7 8 9

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

at Lesson15_generices.GenericArray2.main(GenericArray2.java:55)

时间: 2024-10-26 22:19:52

【ThinkingInJava】37、关于泛型数组的相关文章

【ThinkingInJava】38、泛型数组转化,传递一个类型标识

/** * 书本:<Thinking In Java> * 功能:泛型数组转化,传递一个类型标识 * 文件:GenericArrayWithTypeToken.java * 时间:2015年4月19日10:05:43 * 作者:cutter_point */ package Lesson15_generices; import java.lang.reflect.Array; public class GenericArrayWithTypeToken<T> { private T

ActionScript3.0(AS3)中的泛型数组Vector

Adobe官方并没有"泛型数组"的叫法,这是我自己对Vector的叫法(有点标题党),不过Vector在使用上确实跟c#中的泛型数组有些相似之处. 原作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com 我们知道:ActionScript3.0中的Array数组可以存放多种类型,甚至在同一个Array数组中,可以同时存入String,Object,Number...,但其实我们在实际开发中,通常一个数组中所保存的元素类型都是一致的,为了改进这种情况下的效率,AS

[转]:Delphi XE中泛型数组的使用范例

Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses Generics.Collections, Generics.Defaults; {测试 TArray 的 Sort 方法} procedure TForm1.Button1Click(Sender: TObject); var arr: TArray<string>; //同 array of

泛型的其他应用-接口,方法定义使用,泛型数组,泛型的嵌套设置。

掌握泛型的接口的使用: 掌握泛型方法的定义与使用: 掌握泛型数组的使用: 掌握泛型的嵌套设置: 具体内容 1.1泛型接口基本概念 之前所有的操作都是在类中直接使用泛型操作的,那么,对于JAVA来说,也可以在接口中定义及使用泛型. 声明泛型接口: interface 接口名称<接口标示>{} interface Info<T> { public T getInfo(); } 如果现在一个子类实现此接口是没有进行正确的实现,则在编译时候会出现警告, 例子: interface Info

java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)

JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型  其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1.str2的值是可变的.而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和st

Java 泛型 泛型数组

直接创建泛型数组不能通过编译,而转型对象数组通过编译但是不能在JVM运行 public class ArrayOfGeneric{ static Generic<Integer>[] gia; @SupperssWarnings("unchecked") public static void main(String[] args){ gia = (Generic<Integer>[])new Generic[100]; // 通过类型转换匿名对象 //! gia

Java 泛型数组

Java 不支持泛型数组.也就是说, [java] view plaincopy List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 [java] view plaincopy List<String>[] ls = new ArrayList[10] 却可以. 是我一直不清楚为什么不能够声明泛型的数组,指定类型可以让编译的时候不会出现类型安全的提示. 直到今天我看到Sun的一篇文档才清楚,里面提到了一种情况:

泛型数组列表 ArrayList

为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型]就是类型参数的类型 对泛型数组列表的操作: 1.添加元素,add方法,默认在尾部添加,变化参数可以插入到中间.删除元素 2.初始化容量(ensurecapacity或是把初始容量传递给构造器) 3.回收多余的存储空间(trimToSize) 4.访问数组元素 get(i) 5.转化为数组 toArray

泛型数组随机排列工具类

前言:最近开发一款简易游戏,要将一个数组中的内容随机排列.考虑到以后可重用性,所以自己写了一款"泛型数组随机排列工具类",现在分享给大家,希望能给大家带来启发.如果有好的方法类,请发给笔者邮箱,大家互相学习,感激不尽. ?源码: import java.lang.reflect.Array; import java.util.Random; /** * 泛型数组随机排列工具类. * * 要求:使用类类型. * * 示例: * * public static void main(Stri