【问题标题】:Typecasting Elements in java.util.Listjava.util.List 中的类型转换元素
【发布时间】:2011-10-05 23:01:20
【问题描述】:

我有两个名为“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”的情况下,是否有可能或有任何有效的方法来进行这样的转换?

【问题讨论】:

    标签: java arraylist type-conversion extends


    【解决方案1】:

    按照 Peter 的建议,您可以将方法签名更改为如下所示,

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

    然后你可以在 return 语句中转换你的列表,比如,

    (List<T>) list;
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      你可以尝试做这样的事情:

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

      【讨论】:

        【解决方案3】:

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

        List<City> cityObjects = (List) baseCatalogObjects;
        

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

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

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

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

        【讨论】:

        • List cityObjects = (List) baseCatalogObjects 如果我取消“未选中”警告,则可以工作。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2017-03-18
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多