1

私は持っていて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";
    }
} 
4

4 に答える 4

3

これは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()) {
          ...
       }
   }
}
于 2012-12-02T18:28:51.483 に答える
0

これが役に立ちますように。

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";   
    }
} 
于 2012-12-02T18:29:37.917 に答える
0

メソッドのシグネチャを変更して新しいパラメーターを追加する場合は、スーパー タイプ トークン パターンを使用して、実行時に型パラメーターを識別できます。スーパー タイプ トークン と の両方が と区別Class<T>できます。ただし、スーパー タイプのトークンは、他のトークンと区別できるため、より強力です。LocationsZonesSet<Locations>Set<Zones>

GuavaはTypeTokenの実装を提供します。

public <T> String checkListType(List<T> checkList, TypeToken<T> typeToken) {
    if (typeToken.equals(TypeToken.of(Locations.class))) {
        return "Locations";
    } else {
        return "Zones";
    }
}
于 2012-12-02T18:30:18.737 に答える
0

ジェネリックは型消去を使用して実装されるため、簡単に行うことはできません。リストが空ではないことがわかっている場合は、次のようなことができます

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 型の場合は別のことを行う」という形式のコードを書いていることに気付いたときはいつでも、自分を叩いてください。

http://www.javapractices.com/topic/TopicAction.do?Id=31から引用

于 2012-12-02T18:32:20.123 に答える