Java 列表中列表的特定泛型类型

Java 列表中列表的特定泛型类型,java,list,generics,collections,generic-collections,Java,List,Generics,Collections,Generic Collections,我有一份清单 我想知道如何限制每个内部列表的泛型类型,以便外部列表的每个元素都包含一个只能包含一种对象类型的内部列表。到目前为止,我已经尝试过: List<ArrayList<?>> l = new ArrayList<ArrayList<?>>(); List>(); 但是有一些方法可以将不属于的对象类型添加到内部列表中。有没有办法指定内部列表接受的类型 例如,如果我有以下内部列表 ArrayList<T1> innerList

我有一份清单

我想知道如何限制每个内部列表的泛型类型,以便外部列表的每个元素都包含一个只能包含一种对象类型的内部列表。到目前为止,我已经尝试过:

List<ArrayList<?>> l = new ArrayList<ArrayList<?>>();
List>();
但是有一些方法可以将不属于的对象类型添加到内部列表中。有没有办法指定内部列表接受的类型

例如,如果我有以下内部列表

ArrayList<T1> innerList = new ArrayList<T1>();
ArrayList<T2> innerList2 = new ArrayList<T2>();
ArrayList<T3> innerList3 = new ArrayList<T3>();
ArrayList innerList=new ArrayList();
ArrayList innerList2=新的ArrayList();
ArrayList innerList3=新的ArrayList();
如何创建一个外部列表,该列表可以包含所有内部列表,同时保留内部列表包含的特定类型


我也不确定这是否可能,或者我正在做的是不是糟糕的设计。如果是糟糕的设计,那么对更好的设计的深入了解(也许有一个不同的集合可以做得更好)将是非常值得的。

如果内部列表的类型没有共同点,就没有办法缩小范围,而通配符
是最好的选择

如果
T1
T2
T3
都是从基类
B
扩展而来,则可以编写:

List<List<? extends B>> outerList = new ArrayList<List<? extends B>>();

List如果内部列表的类型没有共同点,就没有办法缩小范围,通配符
是最好的选择

如果
T1
T2
T3
都是从基类
B
扩展而来,则可以编写:

List<List<? extends B>> outerList = new ArrayList<List<? extends B>>();

List如果您有固定数量的类型可以进入这些列表,那么您可以为这些类型中的每一个创建子类型。这还有一个优点,即您可以使用instanceof来确定列表的类型,如果您有一个不同类型列表的列表,您可能希望这样做

// common supertype for the lists
abstract class SpecialList<T> extends LinkedList<T> {}

// a list for every type:
class T1List extends SpecialList<T1> {}
class T2List extends SpecialList<T2> {}
class T3List extends SpecialList<T3> {}


//use
List<SpecialList<?>> l = new ArrayList<SpecialList<?>>(); 
//列表的公共超类型
抽象类SpecialList扩展了LinkedList{}
//每种类型的列表:
类T1List扩展了SpecialList{}
类T2List扩展了SpecialList{}
类T3List扩展了SpecialList{}
//使用
列表>();

如果您有固定数量的类型可以进入此类列表,您可以为这些类型中的每一个创建子类型。这还有一个优点,即您可以使用instanceof来确定列表的类型,如果您有一个不同类型列表的列表,您可能希望这样做

// common supertype for the lists
abstract class SpecialList<T> extends LinkedList<T> {}

// a list for every type:
class T1List extends SpecialList<T1> {}
class T2List extends SpecialList<T2> {}
class T3List extends SpecialList<T3> {}


//use
List<SpecialList<?>> l = new ArrayList<SpecialList<?>>(); 
//列表的公共超类型
抽象类SpecialList扩展了LinkedList{}
//每种类型的列表:
类T1List扩展了SpecialList{}
类T2List扩展了SpecialList{}
类T3List扩展了SpecialList{}
//使用
列表>();

这是不可能的。泛型信息仅在编译时可用。但是,列表的确切内容和结构在运行时之前是未知的。因此,编译器无法保证每个列表将包含什么。如果你事先知道列表的结构,那么最好考虑一个保持类:

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这是不可能的。泛型信息仅在编译时可用。但是,列表的确切内容和结构在运行时之前是未知的。因此,编译器无法保证每个列表将包含什么。如果你事先知道列表的结构,那么最好考虑一个保持类:

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这似乎是一个反模式。如果任何
specialist
都可以通过将类型的
Class
对象传递到其构造函数并将其设置为公共最终字段来识别类型,那么使用
specialist
而不仅仅是
LinkedList
有什么意义呢LinkedList可以是任何类型的列表,例如LinkedList,而SpecialList只能是T1List(只包含T1对象)、T2List或T3List。这看起来像是反模式。如果任何
specialist
都可以通过将类型的
Class
对象传递到其构造函数并将其设置为公共最终字段来识别类型,那么使用
specialist
而不仅仅是
LinkedList
有什么意义呢LinkedList可以是任何类型的列表,例如LinkedList,而SpecialList只能是T1List(只包含T1对象)、T2List或T3List。是的,它们没有共同点,所以我猜我的设计很糟糕。@Sujen:当然,它们总是以Object作为基类,所以你总是可以使用
list是的,他们没有共同点,所以我猜我的设计很糟糕。@Sujen:当然,他们总是把Object作为基类,所以你总是可以使用
list。你不能在
中添加
ArrayList
List@newacct谢谢你指出这一点。我想我只是混淆了演示通配符边界和存储列表列表。您不能将
ArrayList
添加到
List@newacct谢谢你指出这一点。我想我只是在演示通配符绑定和存储列表列表时弄混了。“到目前为止,我已经尝试过这个”您无法分配
ArrayList>
“到目前为止,我已经尝试过这个”您无法分配
ArrayList>