如何实例化List <MyType>?

我怎么能得到这样的东西工作? 我可以检查(obj instanceof List<?>)但不是(obj instanceof List<MyType>) 。 有没有办法可以做到这一点?

这是不可能的,因为在编译时删除数据types的generics。 这样做的唯一可能的方法是编写一些包装列表的types包装:

 public class GenericList <T> extends ArrayList<T> { private Class<T> genericType; public GenericList(Class<T> c) { this.genericType = c; } public Class<T> getGenericType() { return genericType; } } 
 if(!myList.isEmpty() && myList.get(0) instanceof MyType){ // MyType object } 

您可能需要使用reflection来获取它们的types来检查。 获取List的types: 获取java.util.List的genericstypes

如果您正在validationObject的List或Map值的引用是否为Collection的实例,则只需创build所需List的实例并获取其类。

 Set<Object> setOfIntegers = new HashSet(Arrays.asList(2, 4, 5)); assetThat(setOfIntegers).instanceOf(new ArrayList<Integer>().getClass()); Set<Object> setOfStrings = new HashSet(Arrays.asList("my", "name", "is")); assetThat(setOfStrings).instanceOf(new ArrayList<String>().getClass()); 

如果这不能用generics包装(@ Martijn的答案),最好传递它,而不是铸造,以避免冗余列表迭代(检查第一个元素的types保证什么)。 我们可以在迭代列表的代码片段中投射每个元素。

 Object attVal = jsonMap.get("attName"); List<Object> ls = new ArrayList<>(); if (attVal instanceof List) { ls.addAll((List) attVal); } else { ls.add(attVal); } // far, far away ;) for (Object item : ls) { if (item instanceof String) { System.out.println(item); } else { throw new RuntimeException("Wrong class ("+item .getClass()+") of "+item ); } } 

您可以使用假工厂来包含许多方法,而不是使用instanceof:

 public class Message1 implements YourInterface { List<YourObject1> list; Message1(List<YourObject1> l) { list = l; } } public class Message2 implements YourInterface { List<YourObject2> list; Message2(List<YourObject2> l) { list = l; } } public class FactoryMessage { public static List<YourInterface> getMessage(List<YourObject1> list) { return (List<YourInterface>) new Message1(list); } public static List<YourInterface> getMessage(List<YourObject2> list) { return (List<YourInterface>) new Message2(list); } }