我没有特别使用这个,但是有可能编写一个接受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
可以是任何类型的列表,例如ArrayList
或LinkedList
或您的自定义实现。
答案 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...
}