【问题标题】:how to write T.class in java? [duplicate]如何在java中编写T.class? [复制]
【发布时间】:2012-10-16 12:25:04
【问题描述】:

可能重复:
how to get class instance of generics type T

模板的 T 在

JAXBContext jaxbContext = JAXBContext.newInstance(T.class);

无法编译 T.class ,是否需要反射以及如何?

    public void ConvertObjectToXML(String path, T bobject)
    {
        //Convert XML to Object
        File file = new File(path);
        JAXBContext jaxbContext = JAXBContext.newInstance(T.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        T customer2 = (T) jaxbUnmarshaller.unmarshal(file);
        System.out.println(customer2);
    }

【问题讨论】:

  • 这个“T”参考是什么?它看起来不像是通用的(由于 T.class 参考)。你是怎么来的?
  • T 不是一个类,是吗?
  • 我猜T是这里的泛型类型?在这种情况下,上述代码将无法编译,因为T.class 无效。这是由于类型擦除。如果您在运行时需要泛型的类,请看这里:stackoverflow.com/questions/2225979/…
  • 是的,是泛型类型,Template的T
  • Java 泛型与 C++ 中的模板不同;不要将 T 称为“模板的 T”。

标签: java


【解决方案1】:

由于 Java 处理泛型类型的方式,这段代码无法工作:

public class Factory<T>{
   public T create(){
      return T.class.newInstance();
   }
}

您需要将实际的泛型类型传递给构造函数(或任何其他方法):

public class Factory<T>
   Class<T> c;
   publict Factory(Class<T> c){
       this.c=c;
   }
   public T create(){
       return c.newInstance();
   }
}

经典的方法是从数组中推断出泛型类型,因为数组确实保存了它的类型:

public interface List<T>{
   ...
   T[] toArray(T[] target);
   ..
}

这是因为Factory&lt;T&gt;的实际运行时类型仅仅是Factory,所以运行时无法访问其泛型类型。

【讨论】:

  • 怎么称呼呢?我使用 XMLObj XMLtool = new XMLObj(customer);不成功
  • 最后我使用了 XMLObj XMLtool = new XMLObj(Customer.class);
猜你喜欢
  • 2021-08-27
  • 2017-03-18
  • 2013-12-08
  • 1970-01-01
  • 2018-01-11
  • 2023-03-22
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多