我有两个名为“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”?
答案 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);