是否可以定义一个接受任意数量的嵌套列表的方法?

时间:2014-06-11 11:23:33

标签: java

我没有特别使用这个,但是有可能编写一个接受Java中任意数量的嵌套列表的方法吗?

我得到了这个:

private <T extends List<? extends T>> void masterOfLists(final T list) {

}

现在的一个小问题是它永远不会结束。我既不想丢失泛型,所以只需接受Object并尝试将其转换为List每次传递都不是我的选择。

我希望它足够清楚,但似乎不是某些人,我希望方法masterOfLists接受以下示例(以及更多):

  • masterOfLists(new ArrayList<Object>())
  • masterOfLists(new ArrayList<List<Object>>())
  • masterOfLists(new ArrayList<List<List<Object>>>())
  • masterOfLists(new ArrayList<List<List<List<Object>>>>())

它可能也是Object这样的具体类型,而不是String。 使用过的List可以是任何类型的列表,例如ArrayListLinkedList或您的自定义实现。

2 个答案:

答案 0 :(得分:2)

使用纯List在这里帮助你,你需要定义一个递归类。

作为额外的灵感来源,您可以查看我的Recursive Tic-Tac-Toe

代码

你可以创建一个这样的类:

public class Recursive<T> {
    List<Recursive<T>> sub;
    T value;

    boolean hasSub() {
        return sub != null;
    }
    T getValue() {
        return value;
    }
    void forEach(Consumer<T> t) {
        if (hasSub())
            sub.forEach(t);
        else t.accept(value);
    }
}

您可以使用此类中的逻辑来使用构造函数和/或设置器来防止它具有子列表和实际值。

然后,如果你想迭代它并递归打印出所有子项,你可以使用

Recursive<T> recursive;
recursive.forEach(System.out::println);

然后您的方法可能如下所示:

private <T> void masterOfLists(final Recursive<T> list) {

你无法在任何地方使用纯List,因为列表的泛型类型在运行时不可用,而泛型只会在这里给你带来麻烦。使用递归类更容易。

答案 1 :(得分:-2)

廉价&#39;解决方案是使用您自己的名称扩展ArrayList类,并强制子类上的泛型。 SubClass仍然是一个ArrayList ....:

public class NestingList extends ArrayList<NestingList> {

    // all we do is set the Generics...

}