在泛型编程领域,确定当前泛型类型的特定类通常变得至关重要使用。然而,Java 的泛型类型擦除机制对这一努力提出了挑战。
为了解决这个问题,让我们深入研究一个模拟现实世界场景的示例:
public class MyGenericClass<T> { public void doSomething() { // Imagine a 3rd party library call that expects a Class object T bean = (T) someObject.create(T.class); } }
不幸的是,上面的代码将失败并出现“类型参数 T 的类文字非法”错误。这是因为泛型类型信息在运行时被擦除,导致无法直接使用 T.class。
那么,我们如何克服这个障碍呢?一种可行的解决方案出现了:引入一个接受所需类作为参数的静态工厂方法。
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<>(clazz); } private MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
这种方法允许您在对象创建期间显式指定泛型类,从而有效地绕过运行时擦除问题。然而,它确实有一个缺点:它添加了一些样板代码并使 API 稍微复杂化。尽管如此,当类类型的确定必不可少时,它仍然是一种有效的解决方法。
以上是Java中如何确定泛型类型的类?的详细内容。更多信息请关注PHP中文网其他相关文章!