如何确定泛型在运行时使用的对象类型?
4 回答
由于类型擦除,您无法确定通用对象实例的实际类型参数。您可以做的最好的事情是进行设置,以便您可以将类对象传递给需要知道实际类型的代码。例如,这是java.util.EnumMap
在其构造函数之一中所做的。
如果你的意思是T
in List<T>
(例如),你不能,因为 Java 使用类型 erasure。在运行时,aList<T>
看起来像List
. 这是真的,除非在匿名类的边缘情况下,如果你跳过箍来找到参数类型,这是可能的。但在一般情况下,你不能。您通常必须单独传达该信息。
在运行时无法获取“泛型”的对象类型。如果我们使用 object.getclass(),那么我们可以获取任何具有类名的类的对象。
首先我们解释什么是泛型
Java中的泛型是Java 5中添加的重要功能之一,
来自Oracle 的文档:
泛型被引入 Java 语言以在编译时提供更严格的类型检查并支持泛型编程。为了实现泛型,Java 编译器将类型擦除应用于:
如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或 Object。因此,生成的字节码只包含普通的类、接口和方法。
必要时插入类型转换以保持类型安全。
- 生成桥方法以保留扩展泛型类型中的多态性。
类型擦除确保不会为参数化类型创建新类;因此,泛型不会产生运行时开销。
现在如何借助此链接在运行时获取泛型类型
阅读:http ://www.west-wind.com/weblog/posts/2011/Nov/11/Dynamically-creating-a-Generic-Type-at-Runtime