为什么我不能将计算机部件添加到我的通用订单中?

时间:2017-09-13 05:35:31

标签: java generics

当我尝试编译时,我会在未选中-Xlint的情况下重新编译以获取详细信息。当我运行它时说:" T扩展了在GenericOrder类中声明的Product。

我想" T"意味着我可以在我的阵列中推送任何产品。我的数组也没有给出orderID。我喜欢在前进之前检查一下,但我无法弄清楚如何用一些计算机部件创建GenericOrder。

abstract class Product {
    protected float price;

    // return the price of a particular product
    abstract float price();
}

class ComputerPart extends Product {
    public ComputerPart(float p) {
        price = p;
    }

    @Override
    public float price() {
        return price;
    }
}

class GenericOrder<T> {
    private static int ID = 0;
    private String orderID;
    List<T> order;

    public GenericOrder() {
        orderID = "order ID " + ID++;
        order = new ArrayList<>();
    }

    public String getOrderID() {
        return orderID;
    }

    public void addToOrder(T newProduct) {
        order.add(newProduct);
    }

    public List<T> getProducts() {
        return order;
    }

    public static void main(String args[]) {
        GenericOrder  order = new GenericOrder ();
        order.getOrderID();
        order.addToOrder(new ComputerPart(5));
        order.getProducts();
    }
}

2 个答案:

答案 0 :(得分:2)

main中,只需指定通用类型:

public static void main(String args[]) {
    GenericOrder<ComputerPart> order = new GenericOrder<>();
    order.getOrderID();
    order.addToOrder(new ComputerPart(5));
    order.getProducts();
}

答案 1 :(得分:2)

T 表示该列表可以存储任何内容。这意味着列表可以存储TT可以是任何一种类型。例如,如果IntegerList<T>,则GenericOrder只能存储整数。

这里的问题是GenericOrder order = new GenericOrder (); 是泛型类型。通常,当您使用泛型类型时,您指定所有泛型参数,但您没有:

Object

在这种情况下,编译器将其视为具有Object的泛型参数。这意味着内部列表可以存储Object或任何扩展GenericOrder的内容。这显然不是你想要的。因此,您应该添加通用参数,以表明您需要ComputerPart GenericOrder<ComputerPart> order = new GenericOrder<>();

if (filter.value === 'all') {
  return true;
} else {
  // what ever the value is, we will only
  // show rows that have a column value
  // that matches it
  // If value is 'group1' just show the ones where the column
  // value is 'group1', etc etc.
  return row[filter.id] == filter.value;
}