Java 如何使用泛型获取集合的内容?

Java 如何使用泛型获取集合的内容?,java,generics,collections,Java,Generics,Collections,我从hibernate查询中获取对象。然后我有一个字段列表,我必须在这个对象上调用它的getter。因此,在调用这些getter之后(不依赖于我,所以我不知道它们返回什么),我将这些对象放在一个数组对象[]中。现在我正在遍历这些对象,其中一些对象又是包含其他对象的集合。 所以我检查对象是否是这样的集合 private static boolean isCollection(Object obj){ Class clazz = obj.getClass(); return Coll

我从hibernate查询中获取对象。然后我有一个字段列表,我必须在这个对象上调用它的getter。因此,在调用这些getter之后(不依赖于我,所以我不知道它们返回什么),我将这些对象放在一个数组对象[]中。现在我正在遍历这些对象,其中一些对象又是包含其他对象的集合。 所以我检查对象是否是这样的集合

private static boolean isCollection(Object obj){
    Class clazz = obj.getClass();
    return Collection.class.isAssignableFrom(clazz) ||     
     Map.class.isAssignableFrom(clazz);
}
现在我需要做一些事情,比如:

 if(isCollection(object)){
       get subobjects from this collection();
       getDeclaredMethods of this type of object();
       do something with everyObject();
}
感谢所有关于如何使此通用的帮助。哦,是的,这个方法是检查一个映射,但在我的情况下,通常不能返回映射,只能返回集合和列表

多谢各位

编辑:我会在这里添加准确的代码,以备不清楚时参考

Object[] objectRow = parseObject(hibernateObject);
for(Object field: objectRow){
      get subobjects from this collection();
   getDeclaredMethods of this type of object();
   do something with everyObject();
}

public Object[]parseObject(Object mainObject)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException{
rowToReturn=新对象[fieldObjects.size()];
方法[]allMethods=mainObject.getClass().getMethods();
方法[]getters=findGetters(所有方法);
cutGetters(getters);//构建映射,以便将getters与字段匹配
用于(FieldObject字段:fieldObjects){
if(getterNameMethodMap.containsKey(field.getFinalFieldName())){
方法methodToInvoke=getterNameMethodMap.get(field.getFinalFieldName());
objectinvokedobject=methodToInvoke.invoke(mainObject,(Object)null);
rowToReturn[field.getOrder()]=invokedObject;//将我们得到的内容放入最终数组中
}
}
返回rowToReturn;
}
私有void getter(方法[]getter){
getternamethodmap=newhashmap();
for(方法getter:getter){
字符串stringToGet=getter.getName().substring(4,getter.getName().length());
getterNameMethodMap.put(stringToGet,getter);
}

这正是泛型试图阻止的代码。泛型试图从您的代码中分散
if object.type==class
。请看这里,这只是一个介绍:

由于您有一个对象集合的集合,您可以执行如下操作:

List<List<? extends Shape>>

List由于泛型在编译时被删除,根据定义,如果您在编译时不知道对象的类型,则不能使用泛型来确定该类型。不幸的是,如果不更改代码中提供的对象数组,那么确定其类型的唯一方法就是手动检查他返回了对象的类型,就像您已经在做的一样

进一步资料:


附言:这并不是说没有更有效的方法来做你正在做的事情。通过将那些你已经确定的对象转换为集合,你也许可以“做点什么”无需借助反射来获取声明的方法。但是,实际确定不能是泛型的快捷方式。

您真的需要同时包含“非集合”和“非集合”的集合吗对象和其他集合?让一个集合包含来自不同类层次结构的对象很少是一个好的决定。@stoupa:我从hibernate查询中获取一个对象。在这个对象上,我必须调用一些getter方法,无论它们返回什么,我都必须放在这个列表中……目前我不认为将对象分开是合适的m、 因为我永远不知道我会得到什么,可以是任何东西:/@Julia:如果我理解正确,您正在添加从不同getter方法返回的结果(使用不同的返回类型)到上面提到的一个集合。是吗?@stoupa是的。我从hibernate查询中获取对象。然后我有一个字段列表,我必须调用这些字段的getter。所以在我调用这些getter之后(不依赖于我,所以我不知道它们返回什么),我把这些对象放在一个列表中。然后我必须做我上面解释过的我必须做的:)@Julia:你可以发布你正在描述的代码部分吗?我没有集合集合,我有对象集合。其中一些对象是集合(我这样写:)),一些是字符串,一些是第三个对象。因此ListThis非常不寻常。也许您可以更改生成此集合的方法?例如,将list{list,string,list,string}改为:list{list{},list{string},list{string},list{},list{string}。如果你想迭代,这会更好…你可以看看,我编辑了我的原始帖子,解释了我是如何得到不同对象的初始列表的。谢谢你的回复。
List<List<? extends Shape>>