Java:泛型方法和类型识别

Java:泛型方法和类型识别,java,generics,methods,runtimeexception,Java,Generics,Methods,Runtimeexception,我不太习惯泛型,所以我对如何解决这个问题有点困惑。我已经编写了一个方法,尝试在运行时调用不同的方法。但是我得到了一个ClassCastException,尽管代码在语法上似乎是正确的 我有以下几个类(为了简洁起见,省略了一些getter和setter): 我在这里试图做的是识别调用该方法时在运行时使用的实际类型。在这种情况下,inserttransportes应该能够识别Transporte的特定列表——实现我正在使用的对象 我怀疑我应该用别的东西,而不是 T typeOfTransporte

我不太习惯泛型,所以我对如何解决这个问题有点困惑。我已经编写了一个方法,尝试在运行时调用不同的方法。但是我得到了一个
ClassCastException
,尽管代码在语法上似乎是正确的

我有以下几个类(为了简洁起见,省略了一些getter和setter):

我在这里试图做的是识别调用该方法时在运行时使用的实际类型。在这种情况下,
inserttransportes
应该能够识别
Transporte
的特定
列表
——实现我正在使用的对象

我怀疑我应该用别的东西,而不是

T typeOfTransporte = (T) new Object(); 
因为很明显,这是产生运行时异常的地方。然而,我不太确定如何解决这个问题。对解决方案的任何指示(或处理此问题的特定参考书目)都表示感谢。

问题是:

  • a) 您不能
    new
    您的泛型类型-它在运行时被擦除
  • b) 对象未扩展
    transport
    ,因此无法将其强制转换为
    T
    • 问题是:

      • a) 您不能
        new
        您的泛型类型-它在运行时被擦除
      • b) 对象未扩展
        transport
        ,因此无法将其强制转换为
        T

      您需要将类传递给您的方法:

      public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes, Class<T> clazz) {
      
      ...
      T typeOfTransporte = clazz.newInstance();
      
      公共列表交叉传输(Entidade Entidade,列表传输,类clazz){
      ...
      T typeoftransport=clazz.newInstance();
      
      您需要将类传递给您的方法:

      public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes, Class<T> clazz) {
      
      ...
      T typeOfTransporte = clazz.newInstance();
      
      公共列表交叉传输(Entidade Entidade,列表传输,类clazz){
      ...
      T typeoftransport=clazz.newInstance();
      
      当然,(T)new Object()有问题。当你调用new Object()时,它会创建类Object的实例,就是这样。你不能把它转换成有用的东西

      尝试这样编写您的方法:

      public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes, Class<T> clasz)
      
      公共列表交叉传输(Entidade Entidade,列表传输,clasz类)
      

      使用反射。

      当然,(T)new Object()有问题。当调用new Object()时,它会创建类Object的实例,就是这样。你不能将它转换成有用的东西

      尝试这样编写您的方法:

      public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes, Class<T> clasz)
      
      公共列表交叉传输(Entidade Entidade,列表传输,clasz类)
      

      并使用反射。

      您应该传入一个处理创建新的
      传输的工厂,使用方法(可能使用开关)
      createNew(类您应该传入一个处理创建新的
      传输的工厂,使用方法(可能使用开关)
      createNew(类
      您必须在那里实例化一个特定的类,但不能实例化任何类似类的对象。该类必须实现传输接口


      您必须在那里实例化一个特定的类,但不能实例化任何类似于类的对象。该类必须实现传输接口。

      我试图避免在方法中添加额外的参数(以保持简短)但是看起来这样可以避免额外的工作量。我试图避免在方法中加入额外的参数(保持简短),但是看起来这样可以避免额外的工作量。
      public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes, Class<T> clasz)
      
      T typeOfTransport = (T) new Object(); /* <--- HERE'S THE PROBLEM (?) */
      
      T typeOfTransport = (T) new Barco(); //new Barco() or anything that implements Transport interface