java.util.AbstractList.add对象内部的修改列表处的UnsupportedOperationException

问题描述 投票:-1回答:2

我遇到以下问题。我想在创建对象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;
        }
}
java
2个回答
0
投票

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

例如:List<String> result = Arrays.asList("A", "B");即使您的结果是列表,也应该清楚该列表无法修改。

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


-2
投票

您正在使用java.util.AbstractList,请尝试使用java.util.List

© www.soinside.com 2019 - 2024. All rights reserved.