如何避免递归定义的列表列表的原始类型?

时间:2016-05-25 18:44:19

标签: java arrays list recursion

在Java中,我正在构建一个形式为f(x_1,...,x_n)->y的函数的输出的n维数据结构,然后我将其转换为JSON并传递回客户端,并在其中进行处理。由于数据结构的深度取决于被评估函数的输入参数的数量(它也是n维),我使用递归函数生成数据结构,该递归函数传递参数列表并生成如果传递了两个以上的参数,则列表列表,如果仅传递单个参数,则列出双精度列表。生成列表的方法如下所示:

static private List buildList(List<String> parameters){
    if(parameters.size() > 1){
        List<List> returnList = new arrayList<List>;
        //call buildList to generate contents of returnList;
        return returnList;
    } else {
        List<Double> returnList = array of values generated by another method
        return returnList;
    }
}

此方法由另一个方法调用,该方法获取输出列表,将其转换为JSON,并将其添加到响应对象。

我对这种方法的问题在于,因为直到运行时我才知道数据结构的维度,所以我不确定如何定义我的函数,以便我不处理和返回像{这样的原始数据类型{1}}和List。理想情况下,我似乎应该为三维数据结构键入类似List<List>的返回值,但我不确定如何设置代码来执行此操作。我不编写很多Java代码,因此类型安全对我来说是一个相对陌生的概念,但我的印象是在Java的精彩世界中,原始类型的使用通常是不受欢迎的。

是否有一种避免在这种递归模式中使用原始类型的最佳实践方法,还是应该坚持我目前的方法?

2 个答案:

答案 0 :(得分:1)

每个对象的父类都是Object类。 <Object>可以保留任何内容(List<List<List<Double>>>)。因此,每当您声明List时,都会生成能够容纳任何对象的类型Object

答案 1 :(得分:1)

泛型(“尖括号”之间的东西)用于编译时类型安全检查。 如果在请求之前您不知道给定列表的内容,那就没有意义了。 您可以最轻松地将列表键入List&lt; Object&gt;。 另外,侧面提示,假设你是java 7或更高版本,你可以更简单地声明impl: 列表与LT;对象&gt; myList = new ArrayList&lt;&gt;(); 请注意空&lt;&gt;在ArrayList上。这意味着“按声明的类型”。只是让你的代码稍微简洁一些。