确定泛型类型的类
在泛型编程中,通常需要访问正在使用的泛型类型的类。然而,通用类型信息在运行时会被删除,这使得这项任务本身就具有挑战性。本文探讨了克服此限制的有效解决方法。
挑战
考虑以下代码片段:
public class MyGenericClass<T> { public void doSomething() { T bean = (T)someObject.create(T.class); } }
此代码尝试使用第三方库的 create 方法创建类型 T 的实例,该方法需要 T 的实际类作为参数。但是,直接访问 T.class 会导致类型参数 T 的非法类文字错误。
解决方法
由于泛型类型信息在运行时被删除,因此可以使用替代方法方法是必要的。以下解决方法涉及创建一个接受泛型类型的类作为参数的静态工厂方法:
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<U>(clazz); } protected MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
用法
要使用此解决方法,请创建一个使用 createMyGeneric 工厂方法创建 MyGenericClass 的实例:
MyGenericClass<MyClass> genericInstance = MyGenericClass.createMyGeneric(MyClass.class);
这提供了通过 MyGenericClass 实例中的 clazz 字段对泛型类型的实际类的访问。
缺点
虽然此解决方法有效,但它向解决方案添加了一些样板代码。此外,它还限制了 doSomething 方法中泛型方法或构造函数的使用,因为它们无法直接访问泛型类型信息。
以上是如何在运行时确定泛型类型的类?的详细内容。更多信息请关注PHP中文网其他相关文章!