我有一个返回通用List
的方法。它可以是List<Map>
或List<List>
,具体取决于方法的执行方式。
//sendthis can be either be List<Map> or List<List>
List sendthis = myClass.myMethod();
我正在使用Apache thrift将此List
从服务器发送到客户端(python)。我需要在客户端将列表设为List<Map>
。 Thrift不允许异构集合,因此我需要将列表sendthis
转换为List<Map>
。
在我的情况下myMethod()
仅将List
作为List<Map>
返回,但我无法使用thrift发送它,因为thrift需要List<Map>
而不是List
。
有没有办法将sendthis
转换为List<Map>
而不迭代原始列表并复制到新列表,因为列表中可能包含数万个条目。
注意
我尝试将其转换为所需类型,但没有成功。
修改
myMethod()
的定义无法更改。
答案 0 :(得分:1)
由于java中的所有类都扩展为java.lang.Object
,因此您可以像这样定义列表:
List<? extends Object>
答案 1 :(得分:1)
Thrift不允许异构集合
是和否。
union Whatever {
1 : Foo foo
2 : Bar bar
}
type list<Whatever> HeterogeneousList
现在您有一个列表可以保存Foo
和Bar
s。这有多酷?
答案 2 :(得分:0)
或者,您可以随时轮询列表并检查其第一个参数,以确定列表的真实性质。由于您正在处理原始类型,因此您将无法获得补救措施,但可以抑制某些警告(一旦您确定自己在做什么)。
这是一个如何运作的想法:
List<?> unknown = getUnknowList();
if(!unknown.isEmpty()){
Object first = unknown.get(0);
if(first instanceof List){
@SuppressWarnings("unchecked")
List<List<?>> data = (List<List<?>>) unknown;
doWhatYouWannaDoWithLists(data);
} else if(first instanceof Map){
@SuppressWarnings("unchecked")
List<Map<?,?>> data = (List<Map<?,?>>) unknown;
doWhatYouWannaDoWithMaps(data);
}
}