【问题标题】:product list cannot be cast to iterable type [closed]产品列表不能转换为可迭代类型[关闭]
【发布时间】:2021-04-27 10:49:48
【问题描述】:

产品列表不能转换为可迭代类型你能告诉我如何解决这个问题或更好的逻辑来返回 getProductByName() 值作为字符串类型吗?

public class Products {

    private static Iterable<Products> values() {
        return (Iterable<Products>) new Products(); 
    }
    
    
    private int id;
    private String product;

    private List<Products> p;
    public Products() {
        p = new ArrayList<Products>(6);
        p.add(new Products(0, "Foundation"));
        p.add(new Products(1, "BB Cream"));
        p.add(new Products(2, "Concealer"));
        p.add(new Products(3, "Blush"));
        p.add(new Products(4, "High Lighter"));
        p.add(new Products(5, "Setting Spray/Powder"));
     }
        
     private Products(int id, String product){
        this.id = id;
        this.product = product;
     }
        
     public static Products getProductByName(int id){
        for(Products productName:Products.values()){
            if(productName.getId() == id){
                return productName;
            }
         }   
         return null;
     }

    /* Getters and Setters */    
    }

【问题讨论】:

  • 考虑简单地为private List&lt;Product&gt; p; 提供一个getter PS:为什么你的构造函数是“私有的”?您打算如何创建对象实例?
  • 它在我的代码中是公开的,我只是错误地把它写成了私有
  • 为什么每个产品都有一个产品列表?我会创建一个 Product 类,然后创建一个名为 products 的单独 List
  • new Products().p 是您要查找的 Iterable,转换为 values() 转换 (Iterable&lt;Products&gt;) new Products(); 该类应该是列表本身(扩展)并且没有列表

标签: java iterable


【解决方案1】:

您的代码混淆了许多相互矛盾的概念。您似乎正在定义一个代表单个产品和产品列表的 Products 类。此外,不清楚您是否希望实例化多个产品列表,或者您是否希望通过静态方法拥有一个产品列表。

我建议您定义一个名为Product 的类来表示单个产品。然后,您可以定义第二个名为 Products 的类来表示产品列表,或者您可以将静态方法和变量添加到您的 Product 类中,这样您就可以在任意位置维护该类的单个实例列表时间

这是采用上面列出的第二种方法的代码版本。类名Product 表示单个产品,然后有静态方法可以让您对Product 对象的单个列表进行操作。事实上,产品列表是内置的,并在您第一次尝试访问产品列表时创建。还提供了setProductList 静态方法,可让您创建不同的产品列表并将其插入,而不是使用内置列表。该类的构造函数被公开以允许这样做。

import java.util.ArrayList;
import java.util.List;

class Product {

    private static List<Product> productList = null;

    private static List<Product> products() {
        // If no list of products has been set, use the built-in list
        if (productList == null)
            initProductList();
        return productList;
    }

    private static void initProductList() {
        productList = new ArrayList<Product>(6);
        productList.add(new Product(0, "Foundation"));
        productList.add(new Product(1, "BB Cream"));
        productList.add(new Product(2, "Concealer"));
        productList.add(new Product(3, "Blush"));
        productList.add(new Product(4, "High Lighter"));
        productList.add(new Product(5, "Setting Spray/Powder"));
    }

    public static void setProductList(List<Product> productList) {
        Product.productList = productList;
    }

    private int id;
    private String name;

    public Product(int id, String product){
        this.id = id;
        this.name = product;
    }

    public static Product getProductById(int id){
        for(Product product: Product.products())
            if(product.id == id)
                return product;
        return null;
    }

    public static String getProductNameById(int id) {
        Product product = getProductById(id);
        if (product == null)
            return null;
        return product.name;
    }

    public static void main(String[] args) {
        System.out.println(Product.getProductNameById(0));
        System.out.println(Product.getProductNameById(2));
        System.out.println(Product.getProductNameById(4));
    }
}

结果:

Foundation
Concealer
High Lighter

更新:记录在案...如果我要重新做一次,我会选择展示我在答案文本中建议的其他解决方案。这个类的大部分逻辑是关于管理一个 Product 对象列表,而很少是关于表示每个 Product。我认为最好定义两个类,ProductProducts,并将大部分逻辑放在后一个类中。到那时,我可能会一起取消静态方面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2021-06-17
    • 2022-01-11
    相关资源
    最近更新 更多