【问题标题】:Any way to get around type erasure in Java?有什么办法可以绕过 Java 中的类型擦除?
【发布时间】:2015-08-28 21:04:12
【问题描述】:

我想知道 SO 上的 Java 大神是否有任何技巧可以分享如何完成以下工作

public class MyClass<T> {

   public List<T> getMyList(Class1 a, String, b) {
        Generic1<Generic2<T>, Class1> x = new Generic3<T>();
        x.doSomething();
        // this compiles but x doesn't work correctly since (of course) T is now type "Object"
   }
}

//... calling it like this:
MyClass<MyType> c = new MyClass<>();

对于上面的对象“x”要完成它的工作,它需要知道 T 的类型是什么。 Generic1、Generic2 和 Generic3 不是我写的类。但是有什么方法可以传达类型信息以便它们起作用吗?说,如果我在运行时传入该类型的Class?

谢谢。

【问题讨论】:

  • "Any way to get around type erasure in Java?" -- 使用 C#?
  • Avoiding Java Type Erasure 的可能重复项
  • 告诉我们更多关于x的信息。
  • x 在这种情况下是 JpaCriteriaQueryVisitor() 的一个实例......我在上面称之为 Generic3。
  • 请为您的问题提供MCVE...就目前而言,您的问题非常模糊,无法真正回答。

标签: java generics type-erasure


【解决方案1】:

传入Class&lt;T&gt; 对象并使用.newInstance() 而不是new

public class MyClass<T> {
    private final Class<T> clazz;

    public MyClass(final Class<T> clazz)
        { this.clazz = clazz; }

    public List<T> getMyList(Class1 a, String, b) {
        Generic1<Generic2<T>, Class1> x = this.clazz.newInstance();
        x.doSomething();
    }
}

//... calling it like this:
MyClass<MyType> c = new MyClass<>(MyType.class);

【讨论】:

  • 谢谢。我看到您的代码和我的用例之间存在一些差异。我实际上并没有创建 Class 的实例......但我正在创建 Generic3() 的新实例
  • 不错的解决方案,但它并不总是有效,即如果主类中没有 noargs 构造函数,它将崩溃。但是您可以通过使用单一方法创建对象来创建接口提供程序来做得更好。并通过构造函数将此接口的实现传递给您的类。首先它是更多的 oop 解决方案,其次它将允许选择最佳构造函数
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多