java.util.List中的类型转换元素

时间:2011-07-15 08:06:11

标签: java arraylist type-conversion extends

我有两个名为“BaseCatalog”和“City”的课程。 “BaseCatalog”是“City”的父类,换句话说,“City”扩展了“BaseCatalog”类。

我有一个名为“getBaseCatalogObjects”的方法,它接受一个参数catalogType和 返回BaseCatalog对象列表。根据给定的类型,List的类型可能不同,但它总是包含扩展主BaseCatalog类的对象。

因为此方法是通用方法,所以它始终生成包含BaseCatalog对象的List。但是在这种情况下,我确信列表中的每个BaseCatalog实例也是City对象:

List<BaseCatalog> baseCatalogObjects = getBaseCatalogObjects(CatalogType.CITY);

我想要做的是将这个“baseCatalogObjects”列表转换为名为“cityObjects”的列表,如下所示:

List<City> cityObjects = (List<City>) baseCatalogObjects;

是否有可能或有没有有效的方法来执行这样的转换,而不创建新的java.util.List实例并迭代列表“baseCatalogobjects”?

3 个答案:

答案 0 :(得分:3)

如果您“知道”所有元素都是城市,您可以使用类型擦除。 (这会给你一个你可以关闭的警告)

List<City> cityObjects = (List) baseCatalogObjects;

或者您可以将所需的类型传递给搜索,也可以检查它们是否是正确的类型。

List<City> cityObjects = getBaseCatalogObjects(City.class, CatalogType.CITY);

实际上您可能会发现CatalogType是多余的。

List<City> cityObjects = getBaseCatalogObjects(City.class);

答案 1 :(得分:1)

根据Peter的建议,您可以将方法签名更改为以下内容,

public <T extends BaseCatalog> List<T> getBaseCatalogObjects(Class<T> clazz, CatalogType type){}

然后您可以在返回语句中转换列表,如

(List<T>) list;

希望这有帮助!

答案 2 :(得分:0)

您可以尝试这样做:

City[] cityArr = baseCatalogObjects.toArray(new City[0]);
List<City> cityObjects = Arrays.asList(cityArr);