Criar uma ArrayList para cada novo TIPO de produto criado

Bom galera, sou novo aqui e estou começando a aprender Java.
Tenho um exercício da faculdade para fazer só que encontrei dificuldade em um determinado ponto.

O desafio é criar um Shopping Cart, onde tenho uma classe “ShoppingCart” que contém uma interface “Product” que é implementada por outras duas classes, “Book” e “Cloth”, além de ter uma classe gerada entre o relacionamento entre “ShoppingCart” e “Product”, chamada de “ShoppingCartItem”.

“ShoppingCartItem” possui um método que deve me retornar uma lista de produtos criados que pode ser “Book” ou “Cloth”, com suas quantidades e seus totais separadamente. Mas não consigo fazer com que uma ArrayList seja criada para cada 1ª instancia desses produtos não sendo permitida a entrada de um “Book” em uma lista de “Cloth” ou vice-versa.

a classe “ShoppingCartItem”:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;

public class ShoppingCartItem{
	
	ArrayList<Product> cProduto = new ArrayList<Product>();
	BigDecimal total = new BigDecimal(0);
		
	public void addProduto(Product p){
		this.cProduto.add(p);		
	}

	public BigDecimal getQuantity(){
		return new BigDecimal(this.cProduto.size());
	}
	
	public BigDecimal getTotal(){
		for (Product p : cProduto) {
			this.total = this.total.add(p.getPrice());
		}
		return this.total.setScale(2, RoundingMode.HALF_EVEN);
	}

}

Agradeço desde já!

A lista deverá ser uma lista de Product mesmo.
Não precisa ser uma lista específica. O importante é que product tenha os métodos que serão usados em comum, como getDescription(), getAmount() e getPrice().