私はジェネリックスにあまり慣れていないので、この問題をどのように解決するかについて、ここで少し混乱しています。実行時にさまざまなメソッドを呼び出そうとするメソッドを作成しました。ClassCastException
しかし、コードは構文的に正しいように見えますが、私は取得しています。
私は次のクラスを持っています(簡潔にするためにいくつかのゲッターとセッターは省略されています):
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;
}
Javaで許可されていると思ってい<T extends Transporte>
たのではなく、を使用していることに注意してください。<T implements Transporte>
しかし、後者の構文は無効なので、implements
代わりに使用する必要があります...
このメソッドは、次のように呼び出されています。
List<Estacao> allStations;
List<Estacao> myStations = intersectTransportes(entidade, allStations);
ここで私がやろうとしているのは、メソッドを呼び出すときに実行時に使用される実際のタイプを識別することです。この場合、私が使用している特定の実装オブジェクトをinsersectTransportes
認識できるはずです。List
Transporte
私は他のものを使うことになっているのではないかと思います
T typeOfTransporte = (T) new Object();
明らかに、それがランタイム例外が生成されている行だからです。しかし、これを解決する方法がよくわかりません。解決策(またはこの問題に近づいている特定の参考文献)への兆候はありがたいです。