【问题标题】:How to search through arraylist of arraylists / polymorphic array如何通过arraylists /多态数组的arraylist进行搜索
【发布时间】:2020-05-20 18:51:42
【问题描述】:

我正在做一个分级作业,该软件包含多种产品类型,电子、书籍等,每个都有自己的数组列表,每个数组列表都存储在一个主数组列表中。我正在尝试使用 find 方法从其各自的数组列表中返回正确类型的对象,例如,如果用户输入是“食物”和“牛奶”,它知道搜索“食物”数组列表,然后比较字符串“ milk' 到 'food' 数组列表中每个对象的名称属性。

但是,由于软件返回的是对象对象而不是 foodproduct 对象,因此我很挣扎。

arraylists的arraylist创建如下:

public class ProductList {
private ArrayList<ArrayList>Products = new ArrayList<ArrayList>();    
private String Filename;    

public ProductList(){
Products.add(new ArrayList<ElectronicProduct>());
Products.add(new ArrayList<KitchenProduct>());
Products.add(new ArrayList<FoodProduct>());
Products.add(new ArrayList<BookProduct>());
Filename = "ProductList.txt";
} 

使用以下 add 方法将产品添加到正确的数组列表中,它在参数中传递了超类产品对象,但是我尝试在添加到相应的数组之前将它们转换为所需的子类:

public void add(String category,Product src) throws IOException{

switch(category){

    case "Electronic":
    Products.get(0).add(src instanceof ElectronicProduct);
    break;

    case "Kitchen":
    Products.get(1).add(src instanceof KitchenProduct);
    break;

    case "Food":
    Products.get(2).add(src instanceof FoodProduct);
    break;

    case "Book":
    Products.get(3).add(src instanceof BookProduct);
    break;

      }    
}

为了检索对象,我使用以下方法,这就是问题变得明显的地方,尽管它可能是由较早的方法引起的。

它给出了错误'无法将对象转换为电子产品'。

public Product find(String categoryInput, String nameInput){

switch(categoryInput){

    case "Electronic":
    //this does not work
    for(ElectronicProduct product : this.Products.get(0)); 
    // code to compare the nameInput would be here          
    break;

    case "Kitchen":
     //same as above
    break;

    case "Food":
   //same as above
    break;

    case "Book":
    //same as above
    break;

}

请有人帮我找出问题出在哪里,并建议如何解决它?

编辑

按照史蒂夫·韦克福德的建议,我改变了

private ArrayList<ArrayList>Products = new ArrayList<ArrayList>();

private ArrayList<ArrayList<Product>> Products = new ArrayList<ArrayList<Product>>();

但是它现在在这里导致错误:

【问题讨论】:

    标签: java object arraylist return polymorphism


    【解决方案1】:

    将电子/食品创建为对象的子类/扩展。

    【讨论】:

    • 电子/食品类是产品类的扩展。
    【解决方案2】:

    对于产品列表尝试:

    public class ProductList {
        private ArrayList<ArrayList<? extends Product>> Products = new ArrayList<>(); 
        private String Filename;    
    
        public ProductList() {
            Products.add(new ArrayList<ElectronicProduct>());
            Products.add(new ArrayList<KitchenProduct>());
            Products.add(new ArrayList<FoodProduct>());
            Products.add(new ArrayList<BookProduct>());
            Filename = "ProductList.txt";
        }
    } 
    

    您在内部 ArrayList 上使用了非泛型类型,这就是它提供对象而不是 Products 的原因。

    添加时:instanceof 运算符返回真/假。您正在寻找 casting,即 (ElectronicProduct)src,但我认为您不需要它,src 可能没问题。

    检索时:您可能必须获取 Product 并将其转换...

    for (Product product : this.Products.get(0)) {
        // (ElectronicProduct)product
    }
    

    【讨论】:

    • 非常感谢您的帮助,我没有意识到 instanceof 是一个布尔值!我已经使用了您最初的建议,但是在初始化子数组时出现错误,错误在编辑中,您知道为什么会这样吗?
    • ElectronicProduct 是否扩展了产品?
    • 是的,所有看到的类 ElectronicProduct、FoodProduct、BookProduct,都扩展了 Product.. 我确实尝试编写 Products.add(new ArrayList());但这不起作用。
    • Products.add(new ArrayList electronicProduct>());
    • 这是我尝试过的,但我收到的消息是语法不正确,你知道必须修改什么吗?非常感谢您对此的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多