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

我可以在Java中使用泛型类型调用.class吗?

在Java中,您可以使用泛型类型参数调用.class。但是,您需要使用反射API来实现这一点。以下是一个示例:

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

public class GenericClassTest {
    public static void main(String[] args) {
        Class<?> clazz = getClassFromGenericType(new MyClass<>());
        System.out.println("Class: " + clazz.getName());
    }

    public static <T> Class<?> getClassFromGenericType(MyClass<T> myClass) {
        try {
            Method method = myClass.getClass().getMethod("getType");
            return (Class<?>) method.invoke(myClass);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static class MyClass<T> {
        private final Class<T> type;

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

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

在这个示例中,我们创建了一个名为MyClass的泛型类,它具有一个getType方法,该方法返回泛型类型参数的Class对象。然后,我们使用反射API来获取MyClass的泛型类型参数,并将其存储在type字段中。最后,我们在main方法中调用getClassFromGenericType方法,该方法接受一个MyClass实例,并返回其泛型类型参数的Class对象。

请注意,这种方法可能会受到Java泛型擦除的影响,因此在某些情况下可能无法正常工作。在这种情况下,您可能需要使用其他方法来获取泛型类型信息,例如在运行时传递Class对象作为参数。

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

相关·内容

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

开发过程需要根据方法名和方法参数类型数组指定的类根据java编译器的规则找到与之最匹配的方法。...例如,对下面这个类 ,调用test(1,new URL(“http://www.sohu.com“),new Date())会最终调用到哪个方法?...关于方法匹配的方式做了研究,发现java编译器匹配方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现方法的精确匹配。...Double.class); } }; 补充说明 细心严谨的读者可能会发现这里面的逻辑并不十分严谨,可能会出现返回并不匹配方法的结果,不过的应用场景中有别的措施做了保证...,所以不会有问题,你可以根据自己需要再补充一些检查代码。

1.6K30

C++反射调用.NET(三) 使用集合的委托方法C++的列表对象list C++传递集合数据给.NET创建List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

,好在IEnumerable也是继承 IEnumerable 的,所以可以当做非对象C++访问,因此创建上面的委托方法是可行的。...本例,要得到IUserInfo 这个集合的类型可以通过下面的代码: MethodInfo^ method = dotnetObject->GetType()->GetMethod("SaveUsers...创建List实例 我们使用List来做集合对象,C#,我们可以通过下面的方式得到List类型,然后进一步创建对象实例: Type t= typeof(List); 但是,对应的C+...接口的,所以 CreateGenericList 方法中将List对象转换成IList接口对象,之后就可以愉快的使用List对象了。...,因为方法的形参作为返回值,是out的,可以使用派生程度更小的类型

9.1K100
  • 初探Java类型擦除

    例如,一个变量本来是Integer类型,我们代码设置成了String,没有使用的时候只有代码运行到这了,才会报错。 而引入之后就不会出现这个问题。...java.lang.StringgenericMethod(56L); // class java.lang.Long // 调用带返回值的方法String test = genericWithReturnMethod...可以看到函数内部,并没有关心List到底是什么类型的,你可以将理解为只提供了一个只读的功能,它去除了增加具体元素的能力,只保留与具体类型无关的功能。...假设有这样一个需求,我们只允许某一些特定的类型可以调用我们的函数(例如,所有的Animal类以及其派生类),但是目前使用?,所有的类型可以调用函数,无法满足我们的需求。...经过编译之后会采取去化的措施,编译的过程检测了的结果之后会将的相关信息进行擦除操作。就像文章最开始提到的例子一样,我们使用上面定义好的Generic类来举个简单的例子。

    86930

    带你深挖Java类型擦除以及类型擦除带来的问题

    Java基本上都是在编译器这个层次上实现的,在生成的字节码是不包含类型信息的,使用的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。...调用方法时,可以指定,也可以不指定。...A: Java编译器是通过先检查代码类型,然后进行类型擦除,再进行编译。...不过第一种情况,可以实现与完全使用参数一样的效果,第二种则没有效果。...那么,运行时进行类型查询的时候使用下面的方法是错误的 if( arrayList instanceof ArrayList) 3-6.静态方法和静态类的问题 的静态方法和静态变量不可以使用类所声明的类型参数

    3.8K21

    带你深挖Java类型擦除以及类型擦除带来的问题

    Java基本上都是在编译器这个层次上实现的,在生成的字节码是不包含类型信息的,使用的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。...调用方法时,可以指定,也可以不指定。...A: Java编译器是通过先检查代码类型,然后进行类型擦除,再进行编译。...不过第一种情况,可以实现与完全使用参数一样的效果,第二种则没有效果。...那么,运行时进行类型查询的时候使用下面的方法是错误的 if( arrayList instanceof ArrayList) 3-6.静态方法和静态类的问题 的静态方法和静态变量不可以使用类所声明的类型参数

    1.7K40

    听了他讲的就明白为什么他的工资比我多30万了!

    运行在JVM也是一样的,那你可能会有疑问,既然将类型擦除了,那为什么声明的为String类型时,不能往里add一个整型的数据呢?...好了,解释了这么多类型擦除的机制,那Java使用类型擦除来实现有什么好处呢? 1、第一点我们将如此多的在编译时擦除了,那么在运行时显然可以省不少的内存空间嘛。 ?...2、第二点不得不说下兼容性,Java1.5版本推出的,那1.5之前存在大量的线上代码没有的,总不能舍弃吧,所以编译擦除后和没有不是一样,这就兼容了之前更老的Java版本。...3、类型不能当作真实的类型使用 ? 上图中展示了5种使用方式,除了第四种Java能正常使用,其他Java都不能使用,而C#完全没问题。 4、静态方法无法引用类的类型 ?...Java是类实例化的时候才能确定的准确类型,而静态方法是不需要类实例化就能调用的,显然不能使用。 5、类型强转的开销 ?

    58321

    Java深入理解「建议收藏」

    Java基本上都是在编译器这个层次来实现的,这也是Java被称为“伪”的原因。 原始类型 原始类型就是类型擦除了信息后,字节码真正的类型。...我们程序定义了一个ArrayList类型,如果直接调用add方法,那么只能存储整形的数据。 不过当我们利用反射调用add方法的时候,却可以存储字符串。...方法的类型推断 调用方法的时候,可以指定类型,也可以不指定。 不指定类型的情况下,类型为该方法的几种参数类型的共同父类的最小级,直到Object。...>) 4、静态方法和静态类的问题 的静态方法和静态变量不可以使用类所声明的类型参数 public class Test2 { public static...Array可以?

    80520

    你绝对想不到 Kotlin 给反射留下了怎样的坑!

    可问题是你老人家仔细瞅瞅,协变类型强转的事儿,真是没听说过.. 这就有意思了,明明用的是 Person 的实例,怎么后面的属性的参数是 out Person?...其实 Java 也有类似的操作,请看文章:JavagetClass方法的返回值类型 person::class 相当于 Java 的 person.getClass(),尽管这个方法的签名是这样的:...当时就惊呆了,还以为这两种获取 KClass 的方式有什么重大差别呢,结果跟了下源码,是的,this::class 这种写法调试的时候也是可以强制跳入调用栈的(反编译看字节码也可以),二位居然都是调用了下面的方法来获取...类型 Kotlin 调用处做了一次类型强转,一个强转成了 KClass,一个强转成了 KClass 。。。...就问一句,你们这么搞,良心不痛? 4. 小结 这篇文章讲述了一个因 Kotlin 类型严格导致某些情况下反射代码编译不通过的故事。

    8.3K21

    Java声明方法

    参考链接: 我们需要Java的前向声明是什么意思在这就不多说了,而Java类的定义也比较简单,例如:public class Test{}。...但是Java方法就比较复杂了。          类,是实例化类的时候指明的具体类型方法,是调用方法的时候指明的具体类型。         ...本例,forName()方法传入的是User类的完整路径,因此返回的是Class类型的对象,因此调用方法时,变量c的类型就是Class,因此方法T就被指明为...当然,方法不是仅仅可以有一个参数Class可以根据需要添加其他参数。          为什么要使用方法呢?...因为类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而方法可以调用的时候指明类型,更加灵活。

    1.2K10

    转:Java ,你了解类型擦除

    转载自 frank909 的文章 《Java ,你了解类型擦除?》 ---- ,一个孤独的守门者。 大家可能会有疑问,为什么叫做是一个守门者。...但是,现实编码,确实有这样的需求,希望能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。 所以,通配符的出现是为了指定类型范围。...这是因为,信息只存在于代码编译阶段,进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类 java 虚拟机内是没有什么特别的地方。...你可以相像一下,如果 test() 这样被调用 test("123"); 那么实际上相当于 public String test(String t); Java 不能创建具体类型数组 这句话可能难以理解...可量也正因为类型擦除导致了一些隐患与局限。 但,还是要建议大家使用,如官方文档所说的,如果可以使用的地方,尽量使用

    1.4K10

    解析java(一)

    对于我们java,可能很多人知道怎么使用并且使用的还不错,但是认为想要恰到好处的使用,还是需要深入的了解一下它的各种概念和内部原理。...本文将尽可能的囊括java的重要的概念。...例如:MyList,MyList是一种类型,MyList也是一种类型,但是使用的代码块都是MyList,这也就是java引入的一种原因:可以增强代码的复用性...其中,我们管T叫做类型变量,类型变量一般使用大写字母表示并且很短(java使用E表示集合的元素类型,K和V分别表示关键字和值的类型)。      ...java,无论何时定义了一个,它都会自动生成一个相应的原始类型。我们叫这个过程为:类型擦除。

    90560

    Java详解:和Class使用类,方法的详细使用实例

    参考链接: Java的main()函数是强制性的 一、引入  1、是什么  首先告诉大家ArrayList就是。那ArrayList能完成哪些想不到的功能呢?...3、接口定义及使用  接口上定义定义是一样的,代码如下:     [java]     view plain     copy    interface Info{       ...:方法一,我们类中直接把Info接口给填充好了,但我们的类,是可以构造成类的,那我们利用类来构造填充接口会是怎样呢?     ...唯一不同的是,要在函数定义的返回值前加上标识; 5、其它用法:Class类传递及数组  (1)、使用Class传递Class对象 有时,我们会遇到一个情况,比如,我们使用...1,一个是表示某一个类型的参数。为的传递某一类的参数对象  2,另一个则是传递的不是参数,而是代表Class,某一个类。 恰巧使用过,就正好记录一下实际使用实例。

    3.3K50

    十问,你能扛住

    问题二:从ArrayList的角度说一下为什么要用? 答: Java增加机制之前就已经有一个ArrayList类,这个ArrayList类的概念是使用继承来实现的。...,打个比方:造了一个模型,具体填充什么样的材质,由使用者去做决定。...问题四:说说方法的定义和使用 答: 方法可以定义普通类,也可以定义类型变量是放在修饰符的后面,返回类型的前面。...——使用中表示不确定类型 问题六:了解过类型变量的限定?...总结一下: 带有超类型限定的通配符可以对象写入,带有子类型限定的通配符可以对象读取。 问题九:虚拟机是什么样呢? 答: 虚拟机没有类型对象,所有的对象都属于普通类。

    1.1K10

    Java学习笔记

    参考书籍 《Java核心技术:卷1》 , 先睹为快 先通过一个简单的例子说明下Java的用法: 的基本形式类似于模板, 通过一个类型参数T, 你可以"私人定制"一个类,具体定制的范围包括实例变量的类型...2.实例化ObjArray后, 通过调用set方法将String存入Object类型的数组; 而在调用get方法时, 要对取得的值做强制类型转换—从Object类型转为String类型 ObjArray.java...2.可以使用多个类型变量 public class Foo {   private T a;   private U b; } 【注意】Java,常使用E表示集合的元素类型, K和V...分别表示关键字和值的类型, T(U,S)表示任意类型 3.JavaSE7以后,实例化一个类对象时,构造函数可以省略类型 ObjArray arr = new ObjArray...如果是一个静态方法可以使用类型变量的 public class Foo {   public static T get (T t) { // 通过     return t;   } }

    1.2K80

    Java

    它将编译时类型安全性添加到集合框架,并消除了强制转换的繁琐工作。 Why:为什么要引入Java 集合框架的数据元素,是Object类型,也就是可以是任意类型。...使用集合数据时,需要显式地调用 强制类型转换。 1) 有可能引发ClassCastException 2) 问题暴露在运行时 使用强制约束数据类型可以类型 转换问题暴露在编译期。...适当的代码,集合总是伴随着类型参数。当使用类似集合的类型而不使用类型参数时,它称为原始类型。 原始类型类似于通配符类型,这是一个精心设计的决定,允许与预先存在的遗留代码进行互操作。...第二是类型安全。的一个主要目标就是提高Java程序的类型安全,使用可以使编译器知道变量的类型限制,进而可以更高程度上验证类型假设。...支持Java编译器(例如JDK1.5的Javac)可以用来编译经过扩充的Java程序(Generics Java程序),但是现有的没有使用扩充的Java程序仍然可以用这些编译器来编译。

    2.3K51

    揭开Java 类型擦除神秘面纱

    下面的文章,我们正常介绍的相关知识。 的定义和使用 按照使用情况可以分为 3 种。 1. 类。 2. 方法。 3. 接口。 类 我们可以这样定义一个类。...但是,现实编码,确实有这样的需求,希望能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。 所以,通配符的出现是为了指定类型范围。...这是因为,信息只存在于代码编译阶段,进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类 java 虚拟机内是没有什么特别的地方。...你可以相像一下,如果 test() 这样被调用 test("123"); 那么实际上相当于 public String test(String t); Java 不能创建具体类型数组 这句话可能难以理解...可量也正因为类型擦除导致了一些隐患与局限。 但,还是要建议大家使用,如官方文档所说的,如果可以使用的地方,尽量使用

    1.3K30

    揭开Java 类型擦除神秘面纱

    下面的文章,我们正常介绍的相关知识。 的定义和使用 按照使用情况可以分为 3 种。 1. 类。 2. 方法。 3. 接口。 类 我们可以这样定义一个类。...但是,现实编码,确实有这样的需求,希望能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。 所以,通配符的出现是为了指定类型范围。...这是因为,信息只存在于代码编译阶段,进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类 java 虚拟机内是没有什么特别的地方。...你可以相像一下,如果 test() 这样被调用 test("123"); 那么实际上相当于 public String test(String t); Java 不能创建具体类型数组 这句话可能难以理解...可量也正因为类型擦除导致了一些隐患与局限。 但,还是要建议大家使用,如官方文档所说的,如果可以使用的地方,尽量使用

    1.1K10

    Java高级特性之

    我们最常把声明类上: class Generics { // 类名后声明引入类型 private T field; // 引入后可以将字段声明为类型...class java.util.ArrayList,两者类型相同,说明其类型被擦除掉了。...实现 那么类型擦除之后,Java 是如何保证代码执行期间没有问题的呢? 我们将一段代码用 javac 命令编译成 class 文件后,再使用 javap 命令查看其字节码信息: ?...将以上步骤整理了一个流程图,按照这个图,我们可以快速得出能不能用,怎么用。 ? 小结 ---- 好好理了一下,感觉收获颇多,Java 迷雾被拨开了一些。...重要的还是要实践,使用时会很容易发现疑惑的地方。 关于本文有什么问题可以在下面留言交流,如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下,博客一直更新,欢迎 关注 。

    75640

    关于,你可能不知道的事儿

    下面的文章,我们正常介绍的相关知识。 的定义和使用 按照使用情况可以分为 3 种。 1. 类。 2. 方法。 3. 接口。 类 我们可以这样定义一个类。...但是,现实编码,确实有这样的需求,希望能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。 所以,通配符的出现是为了指定类型范围。...这是因为,信息只存在于代码编译阶段,进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类 java 虚拟机内是没有什么特别的地方。...你可以相像一下,如果 test() 这样被调用 test("123"); 那么实际上相当于 public String test(String t); Java 不能创建具体类型数组 这句话可能难以理解...可量也正因为类型擦除导致了一些隐患与局限。 但,还是要建议大家使用,如官方文档所说的,如果可以使用的地方,尽量使用

    1.3K10

    揭开Java 类型擦除神秘面纱

    下面的文章,我们正常介绍的相关知识。 的定义和使用 按照使用情况可以分为 3 种。 1. 类。 2. 方法。 3. 接口。 类 我们可以这样定义一个类。...但是,现实编码,确实有这样的需求,希望能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。 所以,通配符的出现是为了指定类型范围。...这是因为,信息只存在于代码编译阶段,进入 JVM 之前,与相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,类和普通类 java 虚拟机内是没有什么特别的地方。...你可以相像一下,如果 test() 这样被调用 test("123"); 那么实际上相当于 public String test(String t); Java 不能创建具体类型数组 这句话可能难以理解...可量也正因为类型擦除导致了一些隐患与局限。 但,还是要建议大家使用,如官方文档所说的,如果可以使用的地方,尽量使用

    96840
    领券