Java中泛型数组创建总结
在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size)的方式来创建数组例如下面的程序。
public class ArrayMaker<T> {
private Class<T> type;
public ArrayMaker(Class<T> type) {
this.type = type;
}
@SuppressWarnings("unchecked")
T[] createArray(int size) {
return (T[]) Array.newInstance(type, size);
}
List<T> createList() {
return new ArrayList<T>();
}
/** * @param args */
public static void main(String[] args) {
/** Even though kind is stored as Class<T> , erasure means that it is actually just being stored as a Class, with
* no parameter. So, when you do some thing with it, as in creating an array, Array.newInstance( ) doesn’t
* actually have the type information that’s implied in kind; so it cannot produce the specific result, which
* must therefore be cast, which produces a warning that you cannot satisfy.
*/
ArrayMaker<Type> am2 = new ArrayMaker<Type>(Type.class);
System.out.println(Arrays.asList(am2.createArray(10)));
System.out.println(Arrays.asList(am2.createList()));
}
}
class Type {
@Override
public String toString() {
return "type";
}
}
程序一:这个程序主要说明了,在使用泛型数组中容易出现的问题,由于书中对于程序的说明比较详细,所以只对程序做引用。
class Generic<T> {
}
public class ArrayofGeneric {
public static void main(String[] args) {
Generic<Integer>[] genArr;
genArr = (Generic<Integer>[]) new Generic[2];
System.out.println(genArr);
}
}
程序二:这个程序主要是说明在程序的执行过程中,泛型数组的类型信息会被擦除,且在运行的过程中数组的类型有且仅有Object[],如果我们强制转换成T[]类型的话,虽然在编译的时候不会有异常产生,但是运行时会有ClassCastException抛出。
public class ArrayOfGeneric2<T> {
public T[] ts;
public ArrayOfGeneric2(int size) {
ts = (T[]) new Object[size];
}
public T get(int index) {
return ts[index];
}
public T[] rep() {
return ts;
}
public void set(int index, T t) {
ts[index] = t;
}
public static void main(String[] args) {
ArrayOfGeneric2<String> aog2 = new ArrayOfGeneric2<String>(10);
Object[] objs = aog2.rep();
System.out.println(objs);
/* will throw ClassCastException */ // String[] strs = aog2.rep(); //System.out.println(strs);
}
}
程序三:主要说明在对象中通过用Object[]来保存数据,则生成对象是,可以对其持有的对象在T和object之间进行转换,但是当设计到数组的转换时,还是会报ClassCastException
public class ArrayOfGeneric3<T> {
Object[] ts;
public ArrayOfGeneric3(int size) {
ts = new Object[size];
}
public T get(int index) {
return (T) ts[index];
}
public T[] rep() {
return (T[]) ts;
}
public void set(int index, T t) {
ts[index] = t;
}
public static void main(String[] args) {
ArrayOfGeneric3<Integer> aog2 = new ArrayOfGeneric3<Integer>(10);
Object[] objs = aog2.rep();
for (int i = 0; i < 10; i++) {
aog2.set(i, i);
System.out.println(aog2.get(i));
}
Integer[] strs = aog2.rep();
System.out.println(strs);
}
}
程序四:是对泛型数组相对而言比较完美的解决方案
public class ArrayOfGeneric4<T> {
T[] ts;
public ArrayOfGeneric4(Class<T> type, int size) {
/* to solution array of generic key code! */
ts = (T[]) Array.newInstance(type, size);
}
public T get(int index) {
return ts[index];
}
public T[] rep() {
return ts;
}
public void set(int index, T t) {
ts[index] = t;
}
public static void main(String[] args) {
ArrayOfGeneric4<Integer> aog2 = new ArrayOfGeneric4<Integer>(Integer.class, 10);
Object[] objs = aog2.rep();
for (int i = 0; i < 10; i++) {
aog2.set(i, i);
System.out.println(aog2.get(i));
}
try {
Integer[] strs = aog2.rep();
System.out.println("user Array.newInstance to create generci of array was successful!!!!! ");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
原文请见http://developer.51cto.com/art/201202/317813.htm
Java中泛型数组创建总结的更多相关文章
- Java中泛型数组的使用
package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...
- Java中泛型 类型擦除
转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...
- 慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组
来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 或者 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简 ...
- 如何使用 Java 中的数组
Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 数据类型[ ] 数组名: 或者 数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指 ...
- 【JAVA零基础入门系列】Day10 Java中的数组
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
- 第81节:Java中的数组
第81节:Java中的数组 本节介绍数组的基本概念,数据就是一种数据结构,可以用来存储多个数据,每个数组中可以存放相同类型的数据.比如,在学校,我们是一个班,这里的班级中每个同学都是这个班级数组中的元 ...
- Java“禁止”泛型数组
Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...
- Java中的数组与集合
此文转载自:http://student-lp.iteye.com/blog/2082362 在java编程的过程中,我们不能确定某一类型的对象到底会需要多少,为了解决这个问题,java提供了容纳对象 ...
- 【java】解析java中的数组
目录结构: contents structure [+] 一维数组 1,什么是一维数组 2,声明一维数组的三种方式 二维数组 1,什么是二维数组 2,声明二维数组的3种方式 3,二维数组的遍历示例 数 ...
随机推荐
- python pandas 合并数据函数merge join concat combine_first 区分
pandas对象中的数据可以通过一些内置的方法进行合并:pandas.merge,pandas.concat,实例方法join,combine_first,它们的使用对象和效果都是不同的,下面进行区分 ...
- Nginx优化use参数epoll,kqueue,rtsig,eventport,poll
转自:http://blog.sina.com.cn/s/blog_5eaf88f10100gkrq.html Nginx use参数分析对比 下图对比了poll select epoll和kqueu ...
- javascript瀑布流
哇,瀑布流,是的,不错,不错,真的不错,很好玩的样子,于是自己想玩玩啊,来吧,就玩起. 循序渐进,我这里采用原生的js代码来书写.为了方便大家运行代码,我就全部样式和CSS都写在html里面了,当然还 ...
- Ubuntu 搭建简单的git server
Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议. 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他 ...
- Ubuntu设置程序开机自启或者开机禁止加载
先说说ubuntu,它有运行级别这个概念 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 6:重启 例子:按指定顺序.在指 ...
- Java程序员的C++回归路(一)
前言:工作后吃饭的语言是java,同时写一些python和js,在学习机器学习的时候发现有必要再熟悉一下c++,同时工作也有c++的使用需求.于是开始对照c++ primer自学,希望能够对同样是其他 ...
- 安装cocoapods遇到的问题
1.终端报下面的错误 ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod 解决方 ...
- vi/vim 如何添加和删除多行注释
1.进入vi/vim编辑器,按CTRL+V进入可视化模式(VISUAL BLOCK). 2.移动光标上移或者下移,选中多行的开头. 3.选择完毕后,按大写的I键,此时下方会提示进入"inse ...
- React问题集序
问题描述 antd version: 2.7.4 OS and its version: windows7 Browser and its version: Chromium 55.0.2883.87 ...
- GNS3的配置
为了更好的了解协议我决定学习CCNA 安装好GNS3后我们打开 点击设置 先把iso解压,解压完成后倒入 保存结束 然后在输入idlepc get 设备名称 来计算idepc的值 idepc能让我们p ...