有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取泛型T的类型

C#允许使用typeof(T)方法获取泛型参数的类型,而无需实例化T参数。但是在Java中,任何时候我都有泛型T参数,我想确定我必须创建该参数的实例的类型,例如通过使用Class<T> Type来确定它是什么类型

与C#提供的方法相比,Java中的这种方法看起来不必要地冗长和复杂。 我想知道在不需要实例化泛型参数(例如if (T is Integer))的情况下,确定泛型参数类型的最佳选择是什么


共 (2) 个答案

  1. # 1 楼答案

    Java中的泛型是一种编译时特性——因此Java和C#之间不匹配。因此,除非向您传递了该类型的对象,或者您自己创建了一个对象,或者实际上以其他方式告诉了类,否则您无法在运行时执行任何操作来确定该类型

    人们普遍认为,甚至尝试寻找类型都是一个坏主意。它通常表示您没有正确设计类层次结构

  2. # 2 楼答案

    泛型在编译时是真的。。。但是你可以给编译器提示t到底是什么

    通过传入T的实际运行时类,您可以允许编译器允许您了解T所代表的类的运行时知识

    例如:

    public <T> boolean isObjectT(Class<T> type, Object object){
        return object.getClass().isAssignableFrom(type);
    }
    

    这个问题的答案有点明确了参数化类型的限制:

    Java: How do I specify a class of a class method argument?

    如果您只是试图从子类获取信息。。。您可以在此问题上尝试使用参数化类型的反射:

    How to determine the class of a generic type?

    对于更复杂的需求,我很幸运