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

如何从泛型类或方法的成员中获取T的类型?

要从泛型类或方法的成员中获取T的类型,可以使用反射API。在Java中,可以使用Type类和ParameterizedType接口来获取泛型类型。以下是一个示例:

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

public class GenericExample<T> {
    private final Class<T> clazz;

    public GenericExample() {
        Type superclass = getClass().getGenericSuperclass();
        if (superclass instanceof ParameterizedType) {
            ParameterizedType parameterized = (ParameterizedType) superclass;
            Type type = parameterized.getActualTypeArguments()[0];
            if (type instanceof Class) {
                clazz = (Class<T>) type;
            } else {
                throw new IllegalArgumentException("Type parameter T must be a Class");
            }
        } else {
            throw new IllegalArgumentException("GenericExample must be parameterized");
        }
    }

    public Class<T> getType() {
        return clazz;
    }

    public static void main(String[] args) {
        GenericExample<String> example = new GenericExample<>();
        System.out.println("Type of T is: " + example.getType().getName());
    }
}

在这个示例中,我们创建了一个名为GenericExample的泛型类,它具有一个类型参数T。在构造函数中,我们使用反射API来获取泛型类型T的实际类型。然后,我们将该类型存储在一个名为clazzClass对象中,并提供一个getType方法来获取该类型。

main方法中,我们创建了一个GenericExample<String>实例,并使用getType方法获取类型T的实际类型。在这种情况下,输出将是java.lang.String

这种方法可以用于获取泛型类或方法的成员中的任何类型参数。

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

相关·内容

切面获取方法T真实类型

制造问题是起头这三个方法。如 selectByPrimaryKey这个方法,由于这是一个方法,其返回值为T 。...而如果是方法,那么returnType结果就是“T”或者是”List”, 这也就意味着以下反序列化方法执行失败。...这样,只要获取到了切点中正在执行方法返回值(原始类型或者是某个实例),然后根据返回值来获取到Class,并最终获取到Type。这样就可以继续愉快地进行反序列化了。...().equals("T") || returnType.getTypeName().equals("java.util.List")) { 对于T 或者是List方法,就在执行时获取一下执行类型并记录...而在回放时,可以通过获取记录类型来进行反射,获取对应,并最终实现反序列化。

2.2K30

方法类型通配符使用

方法类型通配符使用 一.        声明和非声明类似,除了在名后面添加了类型参数声明部分...和方法一样,类型参数声明部分也包含一个多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...因为他们接受一个多个参数,这些被称为参数化参数化类型。...下面是定义方法规则: 所有方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子)。...下面的例子演示了"extends"如何使用在一般意义上意思"extends"()或者"implements"(接口)。该例子方法返回三个可比较对象最大值。

3.8K40

【Flutter】Dart ( | 方法 | 特定类型约束 )

文章目录 一、Dart 方法 二、Dart 特定类型约束 三、Dart 自带 四、完整代码示例 五、 相关资源 一、Dart 方法 ---- 作用 : 为 ,...接口 , 方法 提供复用性 , 支持类型不确定数据类型 ; : 提高代码复用程度 ; 方法 : 参数返回值有类型约束 , 参数返回值类型必须符合对应类型 , 使用时会进行类型检查约束...Tom I/flutter (24673): 测试, 类型整型, 获取缓存内容为 18 二、Dart 特定类型约束 ---- 还可以进行特定类型约束 , 如指定该类型必须是某个子类..., 使用 约束该必须是某个子类 ; 示例代码 : /// 特定类型约束 /// 将约束为某个类型子类 class Member<T extends.../ : 提高代码复用程度 /// 该类是一个缓存 , 缓存数据类型T , 该类型可以是任意类型 class Cache{ /// 缓存数据存储到该 Map 集合 Map

4.8K00

.NETC# 判断某个是否是类型接口类型

.NET/C# 判断某个是否是类型接口类型 2018-09-01 08:28 .NET 中提供了很多判断某个类型实例是某个子类某个接口实现方法...本文将提供判断接口实现类型子类方法。...---- .NET 没有自带方法 对于实例,.NET 中提供了这些方法来判断: if (instance is Foo || instance is IFoo) { } 对于类型,.NET 中提供了这些方法来判断...这可以得到版本 Foo 类型。 不过,如果你试图拿这个版本 typeof(Foo) 执行上述所有判断,你会发现所有的 if 条件都会是 false。.../// /// 判断指定类型 是否是指定类型类型实现了指定接口。

4K20

生成代码, TT1, T2, Tn —— 自动生成多个类型

生成代码, TT1, T2, Tn —— 自动生成多个类型 发布于 2018-01-31 05:38...更新于 2018-05-25 12:33 当你想写一个 类型时候,是否想过两个参数、三个参数、四个参数更多参数版本如何编写呢?...} 注意到类型变成了多个,参数从一个变成了多个,返回值单个值变成了元组。 于是,怎么生成呢?...在“预先生成事件命令行”填入工具名字和参数,便可以生成代码。 制作生成代码工具 我们新建一个控制台项目,取名为 CodeGenerator,然后把我写好生成代码粘贴到新文件。...于是,在 Program.cs 调用以上代码即可完成生成。我写了一个简单版本,可以将每一个命令行参数解析为一个需要进行转换文件。

1.4K20

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

事情是这个样子...... 对话截图如下: 看了阿Q解释,你是否也和“马小跳”一样存在疑问呢?请往看 我们都知道在java,只要是类型兼容,就可以将一种类型对象分配给另一种类型对象。...那么问题来了,当相关时,如何在两个之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。...小结:可以通过继承或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个之间创建类似子类型关系“问题。...或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建接口之间关系。

2.8K20

C++ rtti vs 宏 - 如何优雅获取类型TnameID

RTTI实现 如何获取一个类型Tname或者唯一ID, 对于这个问题, 最常规方式应该是借助C++rtti了, 比如如ponder中所使用方式: namespace ponder { namespace...利用相同方法也可以很容易获取类型T字符串名称. 在rtti开启情况下, 功能直接可获取....比如decs类型Thash()方式: struct MetatypeHash { size_t name_hash{ 0 }; size_t matcher_hash...通过constexpr, 很好解决了编译期获取类型T唯一字符名称和64位hash问题, 而且不依赖rtti, 比较优雅解决了T->name和T->id问题....当然, 上面的代码其实没有解决跨平台问题, 另外对某一类型T, 获取其实是类似 "const char *__cdecl ecs::MetatypeHash::name_detail(void)"

2.2K10

根据java编译器规则在Class搜索匹配指定参数类型方法(GenericMethod)

因为项目的需要,设计了一个满足特定需要代码自动生成工具。在开发过程需要根据方法名和方法参数类型数组在指定根据java编译器规则找到与之最匹配方法。...void test(int a,URL b,T c){ } public void test(T1 a,T2 b,T3 c){ } } 于是对java关于方法匹配方式做了研究...,发现java编译器在匹配方法时,对参数匹配是遵循从左到右顺序来一个个检查,根据这个规则写了下面的方法来实现方法精确匹配。.../** * @param clazz 要搜索 * @param name 方法名 * @param parameterTypes 希望匹配参数类型数组 *...it.remove(); } if (methods.size() <= 1) //找到唯一匹配方法没有匹配方法就中止循环

1.6K30

Java总结

好处应用 优点:这样做极大地提升程序灵活性,提升扩展性,可以指代成员变量数据类型方法返回值类型以及方法参数类型。 在没有时 ?...3、指明完以后,在集合接口中凡是定义接口时,内部结构(比如:方法、构造器、属性等)使用到位置,都指定为实例化类型。...* 2)只有声明了方法才是方法使用了成员方法并不是方法。 * 3)表明该方法将使用类型T,此时才可以在方法中使用类型T。...只有声明了方法才是方法使用了成员方法并不是方法。 表明该方法将使用类型T,此时才可以在方法中使用类型T。...//这只是中一个普通成员方法,只不过他返回值是在声明已经声明过。 //所以在这个方法才可以继续使用 T 这个

82630

【Java基础】JavaCore核心-技术

@TOC 1.什么是 是在定义、接口和方法时,可以在声明时通过一定格式指定其参数类型 使用时再指定具体类型,从而使得、接口和方法可以被多种类型数据所实例化调用 这种可以在编译时进行参数类型检查技术被称为...2.为什么要用 在没有之前,集合读取到每一个对象都必须进行类型转换 如果插入了错误类型对象,在运行时转换处理就会出错 集合容器里面如果没指定类型,默认都是Object类型,那什么到可以插入...减少了源代码强制类型转换,代码更加可读 案例 图片 3.分类 可以用在、接口和方法,分别被称为接口、方法 字母通常类型参数都使用大写单个字母 T:任意类型 type...名 对象名 = new 名(); 注意 创建使用没有指定类型,则默认是object类型 类型逻辑上看是多个类型,实际都是相同类型 Java 可以创建对应对象和数组引用...主要原因是 Java 有类型擦除,任何类型在擦除之后就变成了 Object 类型或者对应上限类型 那定义如果需要用到数组,如何解决这个问题?

34200

Scala:样例、模式匹配、Option、偏函数、(三)

语法格式 def 方法名[名称](..) = { //... } 示例 示例说明 用一个方法获取任意类型数组中间元素 不考虑直接实现(基于Array[Int]实现) 加入支持...接下来,我们来学习如何定义scala 定义 语法格式 class [T](val 变量名: T) 定义一个,直接在名后面加上方括号,指定要使用参数 指定对应参数后,就使用这些类型参数来定义变量了.../时,限定必须哪个继承、或者必须是哪个。...9.3.1 上界定义 使用<: 类型名表示给类型添加一个上界,表示参数必须要从该类(本身)继承 语法格式 [T <: 类型] 示例 示例说明 定义一个Person 定义一个Student,继承...// demo(Array("hadoop")) } 9.3.2 下界 上界是要求必须是某个子类,或者必须某个继承,而下界是必须是某个本身) 语法格式 [T >: 类型]

2.3K20

关于Java、反射和注解扫盲篇

private T member; //构造方法形参member类型也为TT类型由外部指定 public GenericClassExample(T member...) { this.member = member; } //也可以定义普通方法,普通方法参数也为 public T handleSomething...表示成员变量 Method: 表示方法 Constructor: 表示构造方法 Array: 该类提供了动态创建数组和访问数组元素静态方法 反射依赖Class:用来表示运行时类型信息对应...反射主要用法 如何获取构造方法并使用 在我们上面自定义ReflectTarget创建各种类型构造函数,用于测试 // --------构造函数-------- // 访问修饰符为默认构造函数...,但getDeclareField()方法获取不到从父继承字段 如何获取方法并调用 在在我们上面自定义ReflectTarget创建被各种不同访问修饰符修饰方法,用于测试

12010

03.Scala:样例、模式匹配、Option、偏函数、

语法格式 def 方法名[名称](..) = { //... } 示例 示例说明 用一个方法获取任意类型数组中间元素 不考虑直接实现(基于Array[Int]实现) 加入支持...接下来,我们来学习如何定义scala 定义 语法格式 class [T](val 变量名: T) 定义一个,直接在名后面加上方括号,指定要使用参数 指定对应参数后,就使用这些类型参数来定义变量了.../时,限定必须哪个继承、或者必须是哪个。...9.3.1 上界定义 使用<: 类型名表示给类型添加一个上界,表示参数必须要从该类(本身)继承 语法格式 [T <: 类型] 示例 示例说明 定义一个Person 定义一个Student,继承...// demo(Array("hadoop")) } 9.3.2 下界 上界是要求必须是某个子类,或者必须某个继承,而下界是必须是某个本身) 语法格式 [T >: 类型]

2K20

Java入门(16)-- 枚举类型

真正类型,而在使用方法传递返回数据类型时将不再需要进行类型转换操作,而是使用在声明对象时“”符号设置数据类型。...Map接口中put()与get()方法完成填充容器根据键名获取集合具体值功能。...使用限制后,类型必须实现继承anyClass这个接口,无论anyClass是接口还是,在进行限制时都必须使用extends关键字。...使用类型通配符 在机制,提供了类型通配符,其主要作用是在创建一个对象时时限制这个类型实现继承某个接口子类。要声明这样一个对象可以使用“?”...,则SubClassT1、T2和T3都会自动变为Object,所以一般情况下都将父类型保留。

75330

20 Java 使用反射(Reflection) 和内省技术

反射可以应用于框架开发,它能够配置文件读取配置信息动态加载、创建对象,以及调用方法成员变量。...Field:提供接口中成员变量信息。 Method:提供接口成员方法信息。 Array:提供了动态创建和访问Java数组方法。 Modifier:提供成员访问修饰符信息。...>[] java.lang.Class.getInterfaces() 获取接口实现信息 1.返回实现接口信息Type数组,包含信息 2.返回实现接口信息Class数组,不包含信息...细看一下,就会发现其中端倪,当你实现接口中不包含时,同样调用1方法,其返回接口信息必然不带信息,也就是1包含2。...如何拿到接口中定义Person?

37110

C#反射与特性(九):全网最全-解析反射

目录 1,判断类型 判断是否某种类型 1.1 和委托 1.1.1 判断是否类型委托 1.1.2 判断是否 1.1.3 参数名称和限定 约束 GenericParameterAttributes...我们根据反射类型对象,大概分为:、值类型、数组、结构体、枚举、接口、抽象、委托、事件、各种(方法构造函数等)。...《C#反射与特性(四):实例化类型》第三节,我们探究了各种实例化方式。 约束 对于方法来说,使用版本,可能会进行约束,我们需要将约束解析出来。...where T : 类型参数必须是指定派生自指定 where T : 类型参数必须是指定接口实现指定接口。 可指定多个接口约束。 约束接口也可以是。...先看一下 GenericParameterAttributes 枚举,此枚举是用来描述方法参数约束

1.9K40
领券