Java让泛型实例化的方法

泛型对象可以实例化吗?

不可以,T t=new T()是不可以的,编译器会报错。由于泛型擦除,编译器在编译时无法确定泛型所对应的真实类型

解决方法

使用反射新建实例

Type superclass = getClass().getGenericSuperclass();
ParameterizedType parameterizedType = null;
if (superclass instanceof ParameterizedType) {
  parameterizedType = (ParameterizedType) superclass;
  Type[] typeArray = parameterizedType.getActualTypeArguments();
  if (typeArray != null && typeArray.length > 0) {
   clazz = (Class<T>) typeArray[0];

  }
}

执行结果

控制台输出

完整代码

package com.learn.genericinstance;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericInstanceLearn {
  public static void main(String[] args) throws InstantiationException, IllegalAccessException {
    UserDao userDao = new UserDao();
    System.out.println(userDao.toString());
  }
}

class Dao<T> {
  public Class<T> clazz;
  public T user;
  public Dao() throws IllegalAccessException, InstantiationException {
    Type superclass = getClass().getGenericSuperclass();
    ParameterizedType parameterizedType = null;
    if (superclass instanceof ParameterizedType) {
      parameterizedType = (ParameterizedType) superclass;
      Type[] typeArray = parameterizedType.getActualTypeArguments();
      if (typeArray != null && typeArray.length > 0) {
        clazz = (Class<T>) typeArray[0];
        user= clazz.newInstance();
      }
    }
  }

  @Override
  public String toString() {
    return "Dao{" +
        "user=" + user.toString() +
        '}';
  }
}

class UserDao extends Dao<User> {

  public UserDao() throws IllegalAccessException, InstantiationException {
  }

  @Override
  public String toString() {
    return super.toString();
  }
}

class User {
  String name;

  public User() {
    this.name = "default name";
  }

  @Override
  public String toString() {
    return "User{" +
        "name='" + name + '\'' +
        '}';
  }
}

以上就是Java让泛型实例化的方法的详细内容,更多关于Java泛型实例化的资料请关注我们其它相关文章!

(0)

相关推荐

  • java泛型常用通配符实例解析

    这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天在看ArrayList原码是看到这样的一个符号,好奇怪. ?表示通配符,表示的意思是匹配E或E的子类,具体类型未知. 1.限定通配符 编写一个类似于ArrayList的动态数据 public class Gys<T> { private final static int default_capacity =10; private int end

  • Java 获取泛型的类型实例详解

    Java 获取泛型的类型实例详解 Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等. 以下方式是不正确的: ①.获取带泛型的类的类型 Class lstUClazz = List<User>.class ②获取局部变量泛型的类型 List<User> listUser = new ArrayList<User>(); Type genType = listUser.getClass().getClass().getGenericSuperc

  • Java泛型的使用限制实例分析

    本文实例讲述了Java泛型的使用限制.分享给大家供大家参考,具体如下: 一 什么情况下不能使用泛型 1 不能使用泛型的形参创建对象. T o=new T(); // 不允许 2 在泛型类中,不能给静态成员变量定义泛型 public class A<T> { public static T t; //错误 public T getA(){ //正确 ...... } } 3 泛型类不能继承java.lang.Throwable类 public class D<T> extends j

  • Java泛型与数据库应用实例详解

    本文实例讲述了Java泛型与数据库应用.分享给大家供大家参考,具体如下: 一 点睛 BaseDao定义了基本的数据库增删查改, 之后可以继承该泛型类,实现各自的增删查改,或者使用超类的增删查改,同时每个继承类还能增加自己的操作. 二 实战 1 BaseDao.java import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared

  • Java中泛型使用实例详解

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList()<Ls>; Ls ls1=new Ls("薯片",5f); ff.add(ls1); Ls cls=ff.get(0);//这里不再需要强转 代码实例: 说明:这是非泛型的代码,集合类中调用对象时需要强转 import java.util.*; public class L

  • Java静态泛型使用方法实例解析

    前言:当工具类对多个模型类进行排序,比较等操作的时候,需要书写大量重复代码,因为懒人总要想怎么省事的,所以考虑使用泛型这个玩意简化代码 案例:当前存在两个模型类,Fruit和Person,他们都需要排序方法而且业务逻辑各不相同,因此需要分别写两个排序方法,但因为排序相同的地方太多,唯一的区别就是判断两个对象的大小关系,于是在此做简化操作. 执行步骤: 1.编写模型类接口 interface Model public interface Model<T> { public int compare

  • 实例分析Java泛型

    泛型:即"参数化类型",所操作的数据类型被指定为一个参数.该机制允许程序员在编译时检测到非法的类型. 不使用泛型与使用泛型的区别 不使用泛型代码: import java.util.ArrayList; import java.util.List; public class NoGenerics { public static void main(String[] args){ List arrayList=new ArrayList(); arrayList.add("1&

  • Java泛型定义与用法实例详解

    本文实例讲述了Java泛型定义与用法.分享给大家供大家参考,具体如下: 1. 泛型的由来 先看如下代码: import java.util.List; import java.util.ArrayList; public class TestGeneric { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { List list = new

  • Java让泛型实例化的方法

    泛型对象可以实例化吗? 不可以,T t=new T()是不可以的,编译器会报错.由于泛型擦除,编译器在编译时无法确定泛型所对应的真实类型 解决方法 使用反射新建实例 Type superclass = getClass().getGenericSuperclass(); ParameterizedType parameterizedType = null; if (superclass instanceof ParameterizedType) { parameterizedType = (Pa

  • Java中泛型通配符的使用方法示例

    本文实例讲述了Java中泛型通配符的使用方法.分享给大家供大家参考,具体如下: 一 点睛 引入通配符可以在泛型实例化时更加灵活地控制,也可以在方法中控制方法的参数. 语法如下: 泛型类名<? extends T> 或 泛型类名<? super T> 或 泛型类名<?> ? extends T:表示T或T的子类 ? super T:表示T或T的父类 ?:表示可以是任意类型 二 通配符在泛型类创建泛型对象中使用 1 代码 class gent<T> { publ

  • 浅谈Java泛型让声明方法返回子类型的方法

    泛型典型的使用场景是集合.考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦.本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题. 声明方法返回子类型 在Spring Security的源码里有一个ProviderManagerBuilder接口,声明如下 public interface ProviderManagerBuilder<B extends ProviderManagerBuilder<B>> ext

  • JAVA利用泛型返回类型不同的对象方法

    有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象.此时就需要用到泛型. 首先先解释个概念, 元组:它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改. 利用泛型创建元组 public class ReturnTwo<A,B> { public final A first; public final B second; public ReturnTwo(A a,B b) { first = a; second = b

  • Java反射,泛型在Json中的运用

    最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的框架中也能看到它的身影,可以在运行时检查类,接口.变量和方法等信息,可以实例化调用方法以及设置变量值等.本文主要以代码的形式直接将反射,泛型的运用展现出来. java中的反射 首先新建一个基础类Author. package bean; /** * * @author Super~me * Desc

  • 详解Java 中泛型的实现原理

    泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码.本文总结了 Java 泛型的三种形式以及泛型实现原理. 泛型 泛型的本质是对类型进行参数化,在代码逻辑不关注具体的数据类型时使用.例如:实现一个通用的排序算法,此时关注的是算法本身,而非排序的对象的类型. 泛型方法 如下定义了一个泛型方法, 声明了一个类型变量,它可以应用于参数,返回值,和方法内的代码逻辑. class GenericMethod{ public <T> T[] sort(T[]

  • 半小时通透Java的泛型

    目录 前言 学习目标 1. 什么是泛型 2. 为什么需要泛型 3. 如何使用泛型 3.1 泛型使用 3.2 自定义泛型类 3.2.1 Java 源码中泛型的定义 3.2.2 自定义泛型类实例1 3.2.3 自定义泛型类实例2 3.3 自定义泛型方法 4. 泛型类的子类 4.1 明确类型参数变量 4.2 不明确类型参数变量 5. 类型通配符 5.1 无限定通配符 5.2 extends 通配符 5.3 super 通配符 6. 小结 Java 泛型 前言 编程不能停止,每天发一篇~ 不要捉急往后学

  • Java中Spring获取bean方法小结

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

  • Java实现数据库连接池的方法

    本文实例讲述了Java实现数据库连接池的方法.分享给大家供大家参考.具体如下: package com.kyo.connection; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import j

  • Java接口定义与实现方法分析

    本文实例讲述了Java接口定义与实现方法.分享给大家供大家参考,具体如下: 在java中,我们可以通过继承得到另一个类中的方法,但是这个仅仅满足继承一个方法,那有办法可以多个继承不,就好比,我们人类的基因,总有一部分是继承爸爸,一部分是继承妈妈,而java中有是单继承,那我们怎么办解决?java中就用接口的方式来解决,实现接口,就可以实现所谓的多继承 什么是接口? 一个Java 接口(interface)是一些方法特征的集合,这些方法特征来自于具体方法,这些方法符合它们一般来自于一些在系统中不断

随机推荐