【发布时间】:2021-07-06 09:56:54
【问题描述】:
我想在类FunctionalList<E> implements List<E> 中编写一个方法flatten()。然而,实际上扁平化列表并不是问题。我需要保留原始列表的最深包含的类。
我假设原始列表包含一些元素,因此存在一些 <T> 类,使得类型为 T 的扁平列表的每个元素。我想要返回FunctionalList<T> 的方法。但是,我想不出获得这个类的方法,因为我正在使用泛型,所以这个问题变得特别困难。
我编写了一个简单的递归算法来展平列表:
public <T> FunctionalList<T> flatten(){
FunctionalList<T> l = new FunctionalList<T>();
for(E e : this){
if(e instanceof FunctionalList)
l.addAll(((FunctionalList<?>)e).flatten());
else
l.add((T)e);
}
return l;
}
但看起来这总是返回FunctionalList<Object>,这并不理想。有什么方法可以将[1, 2, [3, 4, 5, [6], 7], [8, 9], 10] 展平为[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],同时将结果存储为List<Integer>(或类似)?
【问题讨论】:
-
FunctionalList应该是泛型的,而不仅仅是本例中的方法。 -
所以 E 是 T 的超类,你试图找到最特化的 T?还是就像在方法中重用 E 一样简单,当然不再声明它?
-
@Sebastian E 在这种情况下很可能是 Object,因为这是我所知道的包含 T 和 List
的唯一方法。
标签: java list generics nested-lists flatten