私は持っていてList<Zones>
、List<Locations>
それをジェネリック関数に渡しています...
public String checkListType(List<?> checkList){
// Now here I want to check if list is of type locations than
return "locations"
else {
return "Zones";
}
}
これはXY 問題のように見えます。 質問されたとおりにお答えしますが、何をしようとしているのかについてさらに情報を提供していただければ、より適切な回答が得られるかもしれません。
Java のジェネリックは実行時に使用できません。http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
いくつかのオプションがあります。クラスをメソッドに渡すことができます。
public <T> String checkListType(Class<T> clazz, List<T> checklist) {
if ("Locations".equals(clazz.getName()) {
} else if (...) {
}
}
リフレクションを使用して、最初の要素の型を識別することもできます。
public String checkListType(List<?> checkList) {
if (!checkList.isEmpty()) {
Class<?> itemClass = checkList.get(0).getClass();
if ("Locations".rquals(clazz.getName()) {
...
}
}
}
これが役に立ちますように。
public String checkListType(List<?> checkList){
if( checkList == null || checkList.isEmpty() ) {
return "UnKnown" ;
}
Object obj = checkList.get(0);
if( obj instanceof Zones ) {
return "Zones";
} else if( obj instanceof Locations ) {
return "locations" ;
}
else {
return "Unknown";
}
}
メソッドのシグネチャを変更して新しいパラメーターを追加する場合は、スーパー タイプ トークン パターンを使用して、実行時に型パラメーターを識別できます。スーパー タイプ トークン と の両方が と区別Class<T>
できます。ただし、スーパー タイプのトークンは、他のトークンと区別できるため、より強力です。Locations
Zones
Set<Locations>
Set<Zones>
public <T> String checkListType(List<T> checkList, TypeToken<T> typeToken) {
if (typeToken.equals(TypeToken.of(Locations.class))) {
return "Locations";
} else {
return "Zones";
}
}
ジェネリックは型消去を使用して実装されるため、簡単に行うことはできません。リストが空ではないことがわかっている場合は、次のようなことができます
public String checkListType(List<?> checkList){
Object first = checkList.get(0);
if (first instanceof Locations) {
return "locations"
else {
return "Zones";
}
}
しかし、これは非常に悪い考えです。
Scott Meyers 著「Effective C++」より:
「オブジェクトが T1 型の場合は何かを行い、T2 型の場合は別のことを行う」という形式のコードを書いていることに気付いたときはいつでも、自分を叩いてください。