【问题标题】:UnsupportedOperationException at java.util.AbstractList.add modify list inside object [duplicate]UnsupportedOperationException at java.util.AbstractList.add 修改对象内的列表 [重复]
【发布时间】:2020-04-12 16:18:39
【问题描述】:

我遇到了以下问题。 我想在创建对象 Product 后添加其他服务并将其删除 - 修改 CartItem 类的 List additionalServices,但发生了此异常。 我在 ShoppingCart 类工作,其中包含方法 void addExtraService(Product product, AdditionalService service) 。

发生了这个异常:

 java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

我不知道如何解决这个问题。

到目前为止我所写的:

void addExtraService(Product product, AdditionalService service) {
    List<AdditionalService> newAdditionalServices;
    for (CartItem i : items) {
        if (i.getProduct().equals(product)) {
            newAdditionalServices= i.getProduct().getServices();
            newAdditionalServices.add(new AdditionalService(service.getName(), service.getPrice()));
            i.setAdditionalServices(newAdditionalServices);
        }
    }
}

void removeExtraService(Product product, AdditionalService service) throws Exception {
    List<AdditionalService> newAdditionalServices;
    for(CartItem i:items){
        if(i.getProduct().equals(product)){
            newAdditionalServices= i.getProduct().getServices();
            newAdditionalServices.remove(service);
            i.setAdditionalServices(newAdditionalServices);
        }
        else{
            throw new Exception("Product doesn't exist");
        }
    }
}

类的样子:

public class Product {
    private final String productId;
    private final int price;
    private final List<AdditionalService> services;
    private final Duration expectedSendingTime;

    public Product(String productId, int price, List<AdditionalService> 
      services, Duration expectedSendingTime) {
        this.productId = productId;
        this.price = price;
        this.services = services;
        this.expectedSendingTime = expectedSendingTime;
    }

    public String getProductId() {
        return productId;
    }

    public int getPrice() {
        return price;
    }

    public List<AdditionalService> getServices() {
        return services;
    }

    public Duration getExpectedSendingTime() {
        return expectedSendingTime;
    }
}

public class CartItem {
        Product product;
        List<AdditionalService> additionalServices;
        int quantity;
        int price; 

        public CartItem(Product product, List<AdditionalService> additionalServices, int quantity, int price) {
                this.product = product;
                this.additionalServices = additionalServices;
                this.quantity = quantity;
                this.price = price;
        }

        public Product getProduct() {
                return product;
        }

        public List<AdditionalService> getAdditionalServices() {
                return additionalServices;
        }
        public void setAdditionalServices(List<AdditionalService> additionalServices) {
               this.additionalServices = additionalServices;
        }

        public int getQuantity() {
                return quantity;
        }

        public int getPrice() {
                return price;
        }
}

【问题讨论】:

  • 显示这个List&lt;AdditionalService&gt; services 列表是如何被实例化的?
  • 还没有,我不知道在我的 CartItem 类中分配它是否正确,但是我尝试在 Carditem 中分配它,这是同样的问题
  • 这条语句返回的 i.getProduct().getServices(); 是不可变列表,这意味着您不能通过查看上面帖子中的代码和错误消息来通过添加或删除项目来修改该列表,我只能说这个声明@Alice
  • @Alice,请不要在评论中插入您的代码,另外,示例中的代码不完整,示例如果您在产品上调用equal,您应该添加equal方法产品内部。如果没有示例,我们无法重现您的问题

标签: java


【解决方案1】:

取决于additionalServices 的基础类型是什么
您可能无法修改列表。

例如:
List&lt;String&gt; result = Arrays.asList("A", "B");
即使您的结果是一个列表,也应该清楚该列表不能被修改。

既然 Java 选择了,顺便说一句。一种非常丑陋的方式,在常用接口(例如 List)中声明一些方法,即使不是所有继承类都支持该方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2019-03-27
    相关资源
    最近更新 更多