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