Это невозможно.Общая информация доступна только во время компиляции.Однако точное содержимое и структура списка списков не будут известны до времени выполнения.Таким образом, компилятор не может дать никаких гарантий относительно того, что будет содержать каждый список.Если вы заранее знаете структуру списка, то было бы лучше рассмотреть класс хранения, например:
class Holder<T,S> {
List<T> listOfTs;
List<S> listOfSs;
}
Если вы знаете, что все списки будут иметь общий супертип, то вы можете использоватьподстановочные знаки.
List<List<? extends Shape>> list = new ArrayList<List<? extends Shape>>();
list.add(new ArrayList<Circle>());
list.add(new ArrayList<Square>());
Это позволит вам манипулировать списками в соответствии с их супертипом.Проблема с подстановочными символами заключается в том, что вы не можете добавлять какие-либо элементы в ограниченные подстановочные наборы.
Примите во внимание следующее:
List<? extends Shape> list = new ArrayList<Circle>();
list.add(new Square());
// element is a valid shape, but not a valid circle
// contract of the original list is broken.
Если вы знаете, что когда-либо будете использовать только определенное количествоОбобщенные, вы можете хранить класс, который каждый представляет, и использовать его для приведения списков безопасным способом.
class ListHolder<T> {
private final Class<T> clazz;
private final List<T> list;
public ListHolder(Class<T> clazz) {
this.clazz = clazz;
this.list = new ArrayList<T>();
}
public boolean isCircleList() {
return this.clazz == Circle.class;
}
public List<Circle> getCircleList() {
if (!isCircleList()) {
throw new IllegalStateException("list does not contain circles");
}
return (List<Circle>) list;
}
public boolean isRectangleList() {
return this.clazz == Rectangle.class;
}
public List<Rectangle> getRectangleList() {
if (!isRectangleList()) {
throw new IllegalStateException("list does not contain rectangles");
}
return (List<Rectangle>) list;
}
public static void main(String[] args) {
ListHolder<Rectangle> rectangleListHolder = new ListHolder<Rectangle>(Rectangle.class );
List<ListHolder<? extends Shape>> list = new ArrayList<ListHolder<? extends Shape>>();
list.add(rectangleListHolder);
ListHolder<? extends Shape> shapeWildCardList = list.get(0);
List<Rectangle> rectangles = shapeWildCardList.getRectangleList();
}
}