我有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";
}
}
如果更改方法的签名以添加新参数,则可以使用Super Type Token 模式在运行时识别类型参数。既是超类型的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";
}
}
泛型是使用类型擦除实现的,因此您不能轻易做到这一点。如果已知列表非空,您可以执行类似的操作
public String checkListType(List<?> checkList){
Object first = checkList.get(0);
if (first instanceof Locations) {
return "locations"
else {
return "Zones";
}
}
但这是一个非常糟糕的主意。
来自有效 C++,由 Scott Meyers 撰写:
任何时候你发现自己在编写“如果对象是 T1 类型,则做某事,但如果它是 T2 类型,则做其他事情”形式的代码,给自己一记耳光。