我有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";
}
}
答案 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>
都可以将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";
}
}
答案 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类型,那么做点其他事情,”自拍吧。