我不太习惯泛型,所以我在这里有点困惑我应该如何解决这个问题。我编写了一个尝试在运行时调用不同方法的方法。但是我得到了一个ClassCastException
虽然代码在语法上看起来是正确的。
我有以下类(为简洁起见,省略了一些 getter 和 setter):
public interface Transporte extends Serializable {
private int id;
private String name;
public abstract int getId() { return this.id; }
public abstract String getName() { return this.name; }
}
public class Barco implements Transporte { /* ... */ }
public class Estacao implements Transporte { /* ... */ }
public class Paragem implements Transporte { /* ... */ }
public class Entidade extends Serializable {
private List<Barco> barcos;
private List<Estacao> estacoes;
private List<Paragem> paragens;
public List<Barco> getBarcos() { return this.barcos; }
public List<Estacao> getEstacoes() { return this.estacoes; }
public List<Paragem> getParagens() { return this.paragens; }
}
我正在尝试实施但遇到困难的方法:
public <T extends Transporte> List<T> intersectTransportes(Entidade entidade, List<T> transportes) {
if(entidade==null || transportes==null) return null;
T typeOfTransport = (T) new Object(); /* <--- HERE'S THE PROBLEM (?) */
List<T> result = new ArrayList<T>();
List<Integer> ids = null;
if(typeOfTransport instanceof Barco) ids = entidade.getIdBarcos(); else
if(typeOfTransport instanceof Estacao) ids = entidade.getIdEstacoes(); // else ...
// now do the work
for(Transporte t : transportes) {
for(Integer id : ids) {
if(t.getId()==id) result.add((T) t);
}
}
return result;
}
请注意,我正在使用<T extends Transporte>
而不是<T implements Transporte>
我期望 Java 允许的那样。但是后一种语法是无效的,所以我必须implements
改用......
正在调用该方法,如下所示:
List<Estacao> allStations;
List<Estacao> myStations = intersectTransportes(entidade, allStations);
我在这里尝试做的是在调用该方法时识别运行时使用的实际类型。在这种情况下,insersectTransportes
应该能够识别我正在使用的特定实现对象List
。Transporte
我怀疑我应该使用其他东西
T typeOfTransporte = (T) new Object();
因为显然这是产生运行时异常的那一行。但是,我不太确定如何解决这个问题。对解决方案(或解决此问题的特定参考书目)的任何指示表示赞赏。