检查List是一种类型还是其他类型

时间:2012-12-02 18:19:26

标签: java jsp servlets

我有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 个答案:

答案 0 :(得分:3)

这看起来像XY problem.我会按照要求回答,但如果您提供有关您尝试做的更多信息,我可能会为您提供更好的答案。

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()) {
          ...
       }
   }
}

答案 1 :(得分: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";   
    }
} 

答案 2 :(得分:0)

如果更改方法的签名以添加新参数,则可以使用Super Type Token pattern在运行时标识类型参数。超类型tokesn和Class<T>都可以将LocationsZones区分开来。但是,超级类型令牌更强大,因为它们也可以区分Set<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";
    }
}

答案 3 :(得分:0)

使用类型擦除实现泛型,因此您无法轻松完成。如果已知列表非空,您可以执行类似

的操作
public String checkListType(List<?> checkList){
    Object first = checkList.get(0);
    if (first instanceof Locations) {
        return "locations"
    else {
        return "Zones";
    }
} 

但这是一个非常糟糕的主意。

来自Effective C ++,作者:Scott Meyers:

  

任何时候你发现你自己写的形式的代码“如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做点其他事情,”自拍吧。

引自http://www.javapractices.com/topic/TopicAction.do?Id=31