java 用泛型参数类型构造数组详解及实例
java 用泛型参数类型构造数组详解及实例
前言:
前一阵子打代码的时候突然想到一个问题。平时我们的数组都是作为一个参数传入方法中的,如果我们要想在方法中创建一个数组怎么样呢?在类型明确的情况下,这是没什么难度的。如果我们传入的参数是泛型类型的参数呢?
public static <T> T[] creArray (T obj){ T[] arr = new T[10]; }
像上面这种用T来直接new数组的方法是错误的,会编译时出现一个:Cannot create a generic array of T. 的错误。Java中不支持未知的类型直接创建数组。
最后我得到了这样一个完美的解决方法:
package Test; import java.lang.reflect.Array; /** * * @author QuinnNorris * 在泛型方法中创建泛型类型的数组 */ public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String a = "ccc";//创建一个String,作为泛型类型 String[] ar = creArray(a); for(String art :ar)//循环打印 System.out.println(art); } //泛型静态方法 public static <T> T[] creArray (T obj){ T[] arr = (T[])Array.newInstance(obj.getClass(), 5); arr[1] = obj; System.out.println(arr[1]); return arr; } }
代码输出如下:
ccc //方法中输出的arr[1] null //以下5个是main中循环迭代出的数组值 ccc null null null
上述的方法是完全可行的,我们通过用Array类的newInstance方法来构造了可指定类型的数组。使用反射来完成这个工作也应该是在情理之中。因为泛型类型T在中运行时才可能被确定下来,我们能创建泛型数组也必然是在java运行时想办法,在java运行时能起作用的技术莫过于反射。
另外看见null,正好在这里也整理一下java中不同类型数组初始化的值情况:
基本类型(数值型):0
基本类型(布尔型):false
基本类型(char型):(char)0
对象类型: null
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
浅谈Java泛型让声明方法返回子类型的方法
泛型典型的使用场景是集合.考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦.本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题. 声明方法返回子类型 在Spring Security的源码里有一个ProviderManagerBuilder接口,声明如下 public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> ext
-
浅谈java中定义泛型类和定义泛型方法的写法
1.方法中的泛型 public static <T> T backSerializable(Class<T> clazz , String path ,String fileName){ FileInputStream fis = null; ObjectInputStream ois = null; Object obj = null; try { fis = new FileInputStream(path + fileName); ois = new ObjectInputS
-
浅谈Java泛型通配符解决了泛型的许多诟病(如不能重载)
泛型: package Java基础增强; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class Test2 { @Test public void fun1(){ Object[] objects = new Object[10]; List list = new ArrayList(); String[] strings = new String[10]; List<Str
-
Java编程探索之泛型擦除实例解析
1.问题引出 源码: public static void main(String[] args) { List<Integer> a = new ArrayList<Integer>(); List<String> b = new ArrayList<String>(); System.out.println(a.getClass() == b.getClass());//结果true } 编译后L public static void main(Stri
-
java的Jackson将json字符串转换成泛型List
Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点 Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现.但是如果要转换复杂类型Collection如 List<YourBean>,那么就需要先反序列化复杂类型 为泛型的Collection Type. 如果
-
java 用泛型参数类型构造数组详解及实例
java 用泛型参数类型构造数组详解及实例 前言: 前一阵子打代码的时候突然想到一个问题.平时我们的数组都是作为一个参数传入方法中的,如果我们要想在方法中创建一个数组怎么样呢?在类型明确的情况下,这是没什么难度的.如果我们传入的参数是泛型类型的参数呢? public static <T> T[] creArray (T obj){ T[] arr = new T[10]; } 像上面这种用T来直接new数组的方法是错误的,会编译时出现一个:Cannot create a generic arr
-
Java 中泛型 T 和 ? 的区别详解
目录 泛型中 T 类型变量 和 ? 通配符 区别 Generic Types 类型变量 用法 2.声明通用的方法 – 泛型方法: 有界类型参数 Wildcards 通配符 1.上界通配符:? extend 上界类型 2.无界通配符:? 3.下界通配符:? super 子类 类型擦除 泛型中 T 类型变量 和 ? 通配符 区别 定义不同 :T 是类型变量,? 是通配符 使用范围不同: ? 通配符用作 参数类型.字段类型.局部变量类型,有时作为返回类型(但请避免这样做) T 用作 声明类的类型参数.
-
Java基础语法之二维数组详解
一.二维数组 进入正题之前.首先为了便于大家理解,我画了一个图: xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素) 经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组) 随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个
-
Java 两种延时thread和timer详解及实例代码
Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程
-
java 单播、广播、组播详解及实例代码
java 单播.广播.组播详解及实例代码 在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播.广播.组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景. 一.通信方式分类: 1.单播:单台主机与单台主机之间的通信: 2.广播:单台主机与网络中所有主机的通信: 3.组播:单台主机与选定的一组主机的通信: 二.单播: 单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样.如果一个人对另外一个人说话
-
java 中JDBC连接数据库代码和步骤详解及实例代码
java 中JDBC连接数据库代码和步骤详解 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(Class
-
Java 异常的栈轨迹(Stack Trace)详解及实例代码
Java 异常的栈轨迹(Stack Trace)详解 捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还有一些别的内容也是和栈轨迹有关的. 1.printStackTrace() 首先需要明确,这个方法并不是来自于Exception类.Exception类本身除了定义了几个构造器之外,所有的方法都是从其父类继承过来的.而和异常相关的方法都是从jav
-
Java泛型的类型擦除示例详解
目录 前言 泛型的类型擦除原则是: 1 擦除类定义中的类型参数 1.1 无限制类型擦除 1.2 有限制类型擦除 2 擦除方法定义中的类型参数 3 桥接方法和泛型的多态 总结 参考资料 前言 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了"伪泛型"的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的"类型擦除"(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生
-
java validation 后台参数验证的使用详解
一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质量的博弈中必然会落后.所以把校验层抽象出来是必然的结果,下面说下几种解决方案. 二.几种解决方案 1.struts2的valid可以通过配置xml,xml中描述规则和返回的信息,这种方式比较麻烦.开发效率低,不推荐 2.validation bean 是基于JSR-303标准开发出来的,使
-
Java单测void类型的方法详解
前言 我们在学Java的时候,老师或者一般的书上都写着,Java的基本类型有八种.分别是:byte.int.short.long.float.double.char.boolean.但是,今早我在看Java的圣经--<Thinking in Java>的时候,发现作者在说明数据类型的时候,把void也放上去了.这样就有九种了.百度了一下,有些书也是写的Java有九种基本类型. Java的Sevice层会有很多void类型的方法,比如save*.update*,这类方法只是做一些更新,不会有返回
随机推荐
- PHP多例模式介绍
- Flex控制弹出窗口拖动范围示例代码
- springMVC结合AjaxForm上传文件
- Python备份Mysql脚本
- 发布WEB站点时出现Server Application Unavailable
- DIV层之拖动、关闭、打开效果代码
- Javascript Cookie读写删除操作的函数
- CI框架的安全性分析
- PHP登录验证码的实现与使用方法
- 每天一个linux命令 chgrp命令
- JS实现图片垂直居中显示小结
- AndroidHttpClient使用Cookie应用分析
- jquery插件制作 提示框插件实现代码
- 广告显示判断
- 谈谈PHP的输入输出流
- adonet基础示例分享(adonet连接数据库)
- 第二节 对象模型 [2]
- RecyclerView滑动到指定Position的方法
- 967 个函式
- Linux利用Sysctl命令调整内核参数