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

如果更改方法的签名以添加新参数,则可以使用Super Type Token 模式在运行时识别类型参数。既是超类型的tokesn,又Class<T>可以Locations区别于Zones. 但是,超级类型令牌更强大,因为它们也可以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";
    }
}
于 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";
    }
} 

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

来自有效 C++,由 Scott Meyers 撰写:

任何时候你发现自己在编写“如果对象是 T1 类型,则做某事,但如果它是 T2 类型,则做其他事情”形式的代码,给自己一记耳光。

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

于 2012-12-02T18:32:20.123 回答