在java中将非参数化列表转换为参数化列表

时间:2014-02-12 11:13:55

标签: java list generics collections thrift

我有一个返回通用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()的定义无法更改。

3 个答案:

答案 0 :(得分:1)

由于java中的所有类都扩展为java.lang.Object,因此您可以像这样定义列表:

List<? extends Object>

答案 1 :(得分:1)

  

Thrift不允许异构集合

是和否。

union Whatever {
  1 :  Foo foo
  2 :  Bar bar
}

type list<Whatever>  HeterogeneousList

现在您有一个列表可以保存FooBar 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);

    }
}