【JAVASE】Java泛型实例化
实例化具有无参数构造函数的泛型对象
//newInstance() method need constructor without parameter
//Class<T> come form Class.class
public <T> T getNewObject(Class<T> cls) {T t=null;try {t = cls.newInstance();} catch (InstantiationException|IllegalAccessException e) {e.printStackTrace();}return t;
}
调用
String i =getNewObject(String.class);
这种方法需要泛型类具有一个无参数构造函数
实例化没有无参数构造函数的泛型对象
//newInstance() method need constructor with parameter
public <T> T getNewObject(Constructor<T> cls, double d) {T t = null;try {t = cls.newInstance(d);} catch (InstantiationException | IllegalAccessException| IllegalArgumentException | InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return t;
}
调用
con = Float.class.getConstructor(double.class);
Float k =getNewObject(con,10.0);
这种方法先确定使用泛型类的哪一个构造函数,再通过该构造函数newInstance实例出来。
通用的实例泛型对象(无需区别是否有无参数构造函数)
通过反射动态创建泛型实例
public class BasePresenter<V extends BaseView,M extends BaseModel>{private M mModel;public void attach(){//1、返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 TypeType genType = getClass().getGenericSuperclass();//2、泛型参数Type[] types = ((ParameterizedType) genType).getActualTypeArguments();//3、因为BasePresenter 有两个泛型 数组有两个try {//mModel= (M) ((Class)types[1]).newInstance();//这里需要强转得到的是实体类类路径
// 如果types[1].getClass().newInstance();并不行,得到的是泛型类型} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public M getModel(){return mModel;}}
getSuperclass和 getGenericSuperclass的区别
- getSuperclass返回直接继承的父类不包括泛型参数
- getGenericSuperclass返回直接继承的父类包含泛型参数
getInterfaces 和 getGenericInterface 的区别
- getInterfaces 返回直接实现的接口(不显示泛型参数)
- getGenericInterface 返回直接实现的接口(显示泛型参数)
封装成工具类
public class ReflectionUtil {/*** 通过type获取className*/public static String getClassName(Type type){if(type==null){return "";}String className = type.toString();if (className.startsWith("class")){className=className.substring("class".length());}return className;}/*** 获取子类在父类传入的泛型Class类型* 获取泛型对象的泛型化参数* @param o* @return*/public static Type getParameterizedTypes(Object o){Type superclass = o.getClass().getGenericSuperclass();if(!ParameterizedType.class.isAssignableFrom(superclass.getClass())) {return null;}Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();return types[0];}/*** 获取实现类的泛型参数* @param o* @return*/public static Type getInterfaceTypes(Object o){Type[] genericInterfaces = o.getClass().getGenericInterfaces();return genericInterfaces[0];}/***检查对象是否存在默认构造函数*/public static boolean hasDefaultConstructor(Class<?> clazz) throws SecurityException {Class<?>[] empty = {};try {clazz.getConstructor(empty);} catch (NoSuchMethodException e) {return false;}return true;}/*** 通过Type创建对象*/public static Object newInstance(Type type)throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class<?> clazz = getClass(type);if (clazz==null) {return null;}return clazz.newInstance();}/*** 通过Type获取对象class* @param type* @return* @throws ClassNotFoundException*/public static Class<?> getClass(Type type)throws ClassNotFoundException {String className = getClassName(type);if (className==null || className.isEmpty()) {return null;}return Class.forName(className);}}
【JAVASE】Java泛型实例化相关推荐
- java泛型实例化_java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- JAVA泛型实例化代码
ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();Class clazz = ( ...
- java泛型实例化_如何实例化泛型spring bean?
我想创建一个泛型类,它将帮助我减少样板代码.我正在使用Spring 3(MVC)和Hibernate 4.如何实例化泛型spring bean? 类看起来是这样的: @Repository(" ...
- java 泛型方法 实例化_Java让泛型实例化的方法
泛型对象可以实例化吗? 不可以,T t=new T()是不可以的,编译器会报错.由于泛型擦除,编译器在编译时无法确定泛型所对应的真实类型 解决方法 使用反射新建实例 Type superclass = ...
- Java泛型06 : 通配符:上边界、下边界与无界
超级通道: Java泛型学习系列-绪论 本章主要对Java泛型的通配符进行说明. 1.概念简介 在Java泛型定义时: 用<T>等大写字母标识泛型类型,用于表示未知类型. 用<T e ...
- java new 删除吗,java泛型对象初始化-java泛型对象会实例化吗T t=new T()
java泛型对象初始化--java泛型对象能实例化吗T t=new T() java中没法得到泛型参数化类型,因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了 泛型反射的 ...
- java泛型程序设计——Varargs 警告+不能实例化类型变量
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识: [1] Vara ...
- 是清单 Dog List的子类 Animal ? 为什么Java泛型不是隐式多态的?
我对Java泛型如何处理继承/多态感到困惑. 假设以下层次结构- 动物 (父母) 狗 - 猫 (儿童) 因此,假设我有一个方法doSomething(List<Animal> animal ...
- 深入理解 Java 泛型
首先提个问题: Java 泛型的作用是什么?泛型擦除是什么?泛型一般用在什么场景? 如果这个问题你答不上来,那这篇文章可能就对你有些价值. 读完本文你将了解到: 什么是泛型 为什么引入泛型 泛型的使用 ...
最新文章
- 用 Python 拓展 GDB(三)
- 6.2、Android Studio内存
- 关于css浮动的一点思考
- 分布式消息队列 Kafka
- 【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据
- mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
- oracle中xml如何存储过程,oracle存储过程生成xml文件
- ssh xm 工具_比较一下几款常用的SSH工具
- Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
- 新版仿山楂岛留言PHP源码+短视频/公众号吸粉引流
- Tungsten Fabric入门宝典丨TF组件的七种“武器”
- QQ通信原理及QQ是怎么穿透内网进行通信的?
- Linux 系统安装后优化项常见操作
- 康特EPON OLT开局配置
- Microsoft office 2007 word PPT 转pdf的插件
- CUDA:CUDA内核中内联PTX(汇编语言)用法的实例
- Nginx sendfile作用
- 耳机主动降噪技术ANC理解
- 最值得推荐的8个手机(华为、小米、OPPO、Vivo等)数据恢复软件
- RPC服务和HTTP服务对比
热门文章
- 只需20分钟,免费搭建你的个人网站!
- 无法安装或运行此应用程序。该应用程序要求首先在“全局程序集缓存(GAC)中安装程序集MySQL版本6.7.4”
- 北京大学计算机专业保研夏令营,北京大学12院系办夏令营 优秀者可保研
- Java安卓如何添加悬浮窗_Android桌面悬浮窗效果实现
- 汇编原理自我总结 (二)
- 「高效程序员的修炼」快速上手python主流测试框架pytest以及单元测试编写
- Ubuntu 16.04下Intel SGX SDK环境搭建(硬件不支持情况)
- 【三维路径规划】基于matlab复杂三维地形的无人机路径规划【含Matlab源码 2171期】
- Python的lambda函数与排序
- 北大双杰——孔庆东和余杰