首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用反射获得泛型类型的正确文本定义?

要获取泛型类型的正确文本定义,可以使用Java反射API。以下是一个简单的示例,说明如何使用反射获取泛型类型的正确文本定义:

代码语言:java
复制
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.List;

public class GenericReflectionExample {

    public static void main(String[] args) {
        Type genericType = getGenericType(MyClass.class, List.class);
        System.out.println("泛型类型的正确文本定义: " + genericType);
    }

    private static Type getGenericType(Class<?> clazz, Class<?> genericInterface) {
        Type[] genericInterfaces = clazz.getGenericInterfaces();
        for (Type genericInterfaceType : genericInterfaces) {
            if (genericInterfaceType instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) genericInterfaceType;
                if (parameterizedType.getRawType().equals(genericInterface)) {
                    return parameterizedType.getActualTypeArguments()[0];
                }
            }
        }
        return null;
    }

    public static class MyClass implements List<String> {
        // ...
    }
}

在这个示例中,我们定义了一个名为MyClass的类,它实现了List<String>接口。我们使用getGenericType方法获取MyClass类的泛型类型。getGenericType方法接受两个参数:一个是要获取泛型类型的类,另一个是要获取泛型类型的接口。

getGenericType方法中,我们首先获取类的所有泛型接口,然后遍历这些接口,检查它们是否是ParameterizedType类型。如果是,我们检查其原始类型是否与给定的泛型接口相同,如果相同,则返回泛型类型的实际类型参数。

在这个示例中,MyClass类实现了List<String>接口,因此getGenericType方法将返回String类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何通过Java反射获取泛型类型信息

前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能够满足我们日常开发中的大多数场景...泛型的使用场景 在讨论如何用反射获取泛型类型之前,我们先来回顾下,在Java里面什么时候会使用泛型,了解这个问题之后,我们才能继续思考如何用反射获取泛型类型。...不能通过发射获取泛型类型信息的场景有二个,分别是: (1)类或接口声明的泛型信息 (2)局部变量的泛型信息 获取方法返回值的泛型类型 如下面定义的一个测试类: public class MyClass...:"+realType); } } } } 总结 本文主要介绍了如何使用反射来获取部分泛型参数的类型信息,并介绍了那些场景不能使用反射获取其类型信息...,通过反射获取参数的类型的泛型信息其实是非常有用的一个功能,比如在一些json工具的开源包里面,可以对Java里面泛型的各种List,List等类型做正确识别,其实就是利用反射的这个功能,从而让解析代码具有更强的通用型

9.3K21

泛型类、泛型方法、类型通配符的使用

泛型类、泛型方法、类型通配符的使用 一.泛型类        泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分...如下实例演示了我们如何定义一个泛型类: 1 public class Box { 2 3 private T t; 4 5 public void add(T t)...下面是定义泛型方法的规则: 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。...下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方法返回三个可比较对象的最大值。...List类型的,所以name,age,number都可以作为这个方法的实参,这就是通配符的作用 2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。

3.8K40
  • 如何在运行时(Runtime)获得泛型的真正类型

    前言 由于Java 的类型擦除机制,在编译时泛型都被转为了Object,例如List经过编译之后将变为类型 List。...可以通过以下的方式再运行时获得泛型的真正类型 泛型如何获得具体类型 List 例子如下 来自:https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list...,都是基于 java.lang.reflect.ParameterizedType jackson 中如何反序列化泛型 jackson 中将JSON 转为Map 的可以通过如下代码实现,方式一: ObjectMapper...可以使用方式二,告知实际 Map 中存放的对象,从而得到正确的类型,代码如下所示: ObjectMapper mapper = new ObjectMapper(); String json = "{\...实际上也是根据 ParameterizedType 获得真正的类型。

    2.9K20

    android 如何正确使用 泛型 和 多参数 “偷懒”

    个选项,采用布局是一个 TextView 对应一个小三角 ImageView,各个选项没被点击时,字体颜色是 黑色,小三角不显示,点击后,字体变色,小三角居下显示,同时在下面的 layout 显示对应的布局内容...要实现这样的逻辑,并不难,但是,如果常规地去写的话,代码段很长,很繁琐!后来我这样做了。...先写个获取 list 的泛型函数,用来获取 要显示的布局集合 再写个获取 TextView 和 ImageView 对应绑定的 Map 泛型函数 最后是整合,集体改变 这样调用 那么我们就配置好了一个选项...,上面共四个选项,对应四个点击事件,就是写四次,你只需要改变,传入的整数,其他不用便,0,1,2,3.....

    1.3K90

    Java Generic 自定义泛型如何自定义泛型自定义泛型的边界共变性,逆变性泛型对象的比较

    如何自定义泛型 考虑我们要实现了一个节点对象,这个对象可以自定义类型,我们可以用泛型语法进行如下的定义: package Generic; public class Node { private...; E next(); void remove(); } 自定义泛型的边界 在定义泛型的时候,可以定义泛型的边界,例如下面的例子 class Animal {} class Human...extends定义指定泛型的真正的形态的时候,必须是animal的子类,你可以使用animal与human来指定形态,但不可以使用toy来指定,因为toy不是animal的子类。...: 在程序中对Basket的类型的判断是不合法的,因为java泛型采用的是类型擦除,也就是说,在程序中泛型语法的类型指定,仅给编译器使用,执行时无法获取类型的信息,因而instanceOf在执行器对比时...,仅能根据basket类型进行对比,无法针对当众的泛型实际的类型进行对比 如果想要通过编译,就要使用通配符?

    1.1K10

    Java 基础(一)| 使用泛型的正确姿势

    顾名思义,就是将类型由原来的具体的类型参数化 (动词),类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参), 然后在使用 / 调用时传入具体的类型(类型实参)。...泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中。...三、泛型详解 3.1 泛型类 由我们指定想要传入泛型类中的类型,把泛型定义在类上,用户使用该类的时候,才把类型明确下来,比如:定义一个万能的实体数据暂存工具类。...有时候我们只想在方法中使用泛型,可以这么定义: 值得注意的是: 与泛型类不同,泛型方法在调用时才确定最终类型 若有返回值,返回值不需要强转 package com.nasus.generic.how;...3.8 泛型的使用规范 1、不能实例化泛型类 2、静态变量或方法不能引用泛型类型变量,但是静态泛型方法是可以的 3、基本类型无法作为泛型类型 4、无法使用 instanceof 关键字或 == 判断泛型类的类型

    58020

    Day14 自己定义泛型类的使用

    泛型的引入和体现: 问题:集合中能够存储各种类型的元素,可是由于集合能够存储各种类型数据。在获取集合中元素时,就会造成数据不安全。...实现方式:在定义集合时明白了该集合中能够存储元素的类型 泛型的使用格式: 类型> 注意:泛型中仅仅能使用引用类型 package org.test; import java.util.ArrayList...import java.util.List; public class TestGeneric { public static void main(String[] args) { //自己定义泛型类的使用...//1.实例化泛型类的对象时指明泛型的类型,这儿不能一般类型,仅仅能是引用类型 //全部使用了泛型类型的地方。...不能缺少 public E getE(E e) { return e; } } //子类还是不确定类型T ,实例化子类的对象时候要指明泛型的引用类型 //继承泛型类或泛型接口时

    47020

    使用反射和泛型简化Golang查询数据库代码的方案

    大纲 Postgresql数组 案例 常规写法 定义结构体 查询数据 问题 反射+泛型写法 结构体定义 接口 Tag 实现逻辑 泛型设计 实例化模型结构体 获取表名 过滤字段 组装SQL语句...常规做法是我们将该字段设计为字符串或者文本类型,存储“1,2,3,4”;在业务逻辑中,数据取出后,我们使用“,”进行切分,并将字符串“1”“2”“3”转换为整型,最后组成数组[1,2,3,4]。...反射+泛型写法 结构体定义 type Model interface { GetTableName() string } type Employee struct { Id...而裸指针的类型是uintptr,就需要使用reflect.NewAt函数对其进行转换。...(error) return } models = append(models, *singleRow) } return } 小结 泛型+反射的方案虽然复杂,但是后续其他表的查询则会变得非常简单

    1.2K40

    java泛型:通过自定义ParameterizedType实现参数化类型中类型参数的替换

    需求说明 如果要动态构造一个泛型参数对象(ParameterizedType),guava提供的TypeToken工具可以部分实现这个功能: 比如下面这个例子(来自guava wiki TypeToken...),可以根据需要定制一个指定K,V类型的Map。...虽然 ParameterizedType接口方法也没几个,但如何自己写个ParameterizedTypeImpl呢? 别逗了,还真打算从头自己写一个啊,再说自己的写的敢用么?...ParameterizedTypeImpl(TypeToken.of(this).getRawType(), typeArgs, getOwnerType()); } /** * 用指定的类型参数替换当前对象的类型参数... * 新参数的个数与当前对象的类型参数个数必须一致, * 如果新参数数组中元素为{@code null}则对应的参数不会被替换 * @param newTypeArguments

    4.8K80

    当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

    那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型的对象是如何实现子类型化的吧。...如果我们想要定义我们自己的列表接口PayloadList,使得泛型类型P的可选值与每个元素相关联,可以定义如下: interface PayloadList extends List {...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。...泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型类或接口之间的关系。

    2.9K20

    C#中的泛型约束:如何利用泛型约束来提高代码的类型安全性和灵活性?

    泛型约束是指可以对泛型类型参数进行限制,只允许特定类型或满足特定条件的类型作为泛型参数。...使用泛型约束可以提高代码的类型安全性和灵活性,以下是一些常见的泛型约束及其作用: 类型约束(class constraint):使用 where T : class 约束可以确保泛型参数必须是引用类型...这可以避免在泛型方法中使用值类型参数,因为值类型参数会被装箱和拆箱,造成性能损失。...这可以在泛型方法中使用接口的方法和属性,而无需知道具体的实现类。...通过使用这些泛型约束,可以在编译时捕获潜在的类型错误,并提供更好的类型安全性。同时,约束也提供了更灵活的代码设计,可以根据特定的约束条件编写更通用、可复用的代码。

    8110

    使用通配符和泛型:完成父子类关系的List对象的类型匹配

    泛型和通配符 使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型。...Java中具备继承关系的类A、B(A extends B)它们的集合List和List之间是没有继承关系的, 可以使用泛型或通配符来让一个方法支持同时接受List和List。...可以通过通配符或者泛型方法实现。 通配符实现 使用List这样的形参,就可以接收集合项为Animal子类的任意List。...泛型方法实现 抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应的具体Animal子类型是一致的,那么就需要用到泛型了: public ...泛型参数也可以是多个的,而且之间存在关系。 小结 以上通过一个不太实际的案例说明了使用泛型和通配符来解决List泛型集合之间的“匹配”问题。这也是它们的主要用途之一。

    1.6K70

    JAVA 的重载是运行时决定还是编译的时候决定?正确使用泛型

    参考链接: 重载Java中的main() 首先看个例子  第一个片段A的部分 传入的实际类型是String希望调用C片段,但是实际上是调用的B。    敲黑板:Java的泛型是运行时就擦除了的。 ...我们看下Optional的泛型如何可以准确找到isEmpty(String s)  Optional str = Optional.of("me");         str.ifPresent...(v->{             boolean exit = Util.isEmpty(v);         });  解决和建议:  一个是去掉泛型,避免同一后再细化。...== 0;     }     throw new SysException("unkown classType {}", clazz.getCanonicalName());     } 另外判断类型是否是某个接口的子类实现或者本身的正确姿势...    System.out.println(null instanceof String);     System.out.println(String.class.isInstance("a"));  正确使用泛型

    48220

    使用通配符和泛型:完成父子类关系的List对象的类型匹配

    泛型和通配符 使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型。...Java中具备继承关系的类A、B(A extends B)它们的集合List和List之间是没有继承关系的, 可以使用泛型或通配符来让一个方法支持同时接受List和List。...可以通过通配符或者泛型方法实现。 通配符实现 使用List这样的形参,就可以接收集合项为Animal子类的任意List。...泛型方法实现 抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应的具体Animal子类型是一致的,那么就需要用到泛型了: public ...泛型参数也可以是多个的,而且之间存在关系。 小结 以上通过一个不太实际的案例说明了使用泛型和通配符来解决List泛型集合之间的“匹配”问题。这也是它们的主要用途之一。 (本文使用Atom编写)

    2.8K00

    一文教懂你如何使用Java的泛型

    回到Java的泛型,对它的理解,对他的编码使用,都有一点难度。不能直接的生硬的去使用,如果不好好理解Java泛型是干什么的话,后面遇到泛型,该懵逼的还是会懵逼。...,这段代码就会报出ClassCastException的异常这是因为,我们没有明确定义list集合当中的元素是个什么样的类型,现在Java有了这个泛型,就可以将问题提前在编译前暴露出来将上面的代码改成使用泛型的样子...,用来规定其中类当中某个属性的类型,限制了这个属性只能为某个类三、泛型的使用1)自己的类使用泛型在代码中,泛型的使用采用进行标识,我们先看下,如何自己定义一个使用泛型的类我定义了一个Person类,...,编辑器爆红了我们将Car实现Property即可,这样就不报错了3)如何在方法中使用泛型刚刚都是属性,现在看看如何在方法中使用泛型其实,这也非常简单,只需要在限定修饰符后加上,自己的符号,在当中定义自己的泛型字母后...(o.toString()); }注意一下,如果类上面有定义好泛型,方法上想要同样的的类型,就可以不用再方法上定义了如下,我就简单写一个两个人交换资产的方法package com.banmoon;​

    4910

    【Vue3】解锁Vue3黑科技:探索接口、泛型和自定义类型的前端奇迹

    文章目录介绍接口泛型自定义类型接口、泛型、自定义相对比结论介绍在Vue3中,我们不仅可以利用其强大的响应式系统和组件化开发来构建灵活的前端应用程序,还可以利用TypeScript(简称TS)的特性来增强代码的可读性...在本文中,我们将深入探讨Vue3中接口、泛型和自定义类型的使用,以便更好地利用这些功能来构建优秀的Vue应用接口首先我们介绍一下接口接口在Vue3中是一种定义对象结构的方式,它可以用来描述对象的形状,包括属性和方法...、自定义相对比接口 vs 泛型:接口用于描述对象的形状,泛型用于增强代码的灵活性。...接口在定义对象结构时更为直观,而泛型适用于编写通用的、适用于多种类型的代码。泛型 vs 自定义类型:泛型用于增强代码的灵活性,而自定义类型用于提高代码的可读性和类型安全性。...泛型可以用于编写通用的代码,而自定义类型用于定义具体的类型结构。结论在Vue3中,接口、泛型和自定义类型是强大的工具,可以帮助我们编写更加健壮、灵活和可维护的代码。

    50910
    领券