使用泛型的覆盖方法

时间:2015-12-16 15:16:01

标签: java

我有一个名为GenericOrder的基类,可用于创建任何类型产品的订单,然后我有更具体的订单子类。我的问题是我的ComputerOrder类和一个我要覆盖的方法。这是基类代码。

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

public class GenericOrder<T> {

private long orderNumber;
private List<T> products;
private T theClass;

public GenericOrder() 
{
    products = new ArrayList<T>();
    orderNumber = System.currentTimeMillis();
}

public long getOrderNumber() {
    return orderNumber;
}

public void addProduct(T newProduct) {
    products.add(newProduct);

}

public int getNumberOfProducts() {
    return products.size();
}

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

public void setProducts(List<T> products)
{
    this.products = products;
}

public T get()
{
    return theClass;
}

public void set(T theClass)
{
    this.theClass = theClass;
}
}

这是我的子类代码。 getProducts是我遇到问题的方法。

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

public class ComputerOrder<T> extends GenericOrder<T> {
    private List<ComputerPart> computerParts = new ArrayList<ComputerPart>();
    private String orderType = "Computer Parts";

public ComputerOrder() {
    super();

}

public void addProduct(ComputerPart newProduct) {

    computerParts.add(newProduct);

}

public String getOrderType() {
    return orderType;
}

public int getNumberOfProducts() {
    return computerParts.size();
}


public List<T> getProducts()
{

    return computerParts;
}


}

我得到的错误无法从List(ComputerPart)转换为List<T>

4 个答案:

答案 0 :(得分:11)

错误很明显:声明getProducts()返回List<T>但您返回List<ComputerPart>。我认为我们同意这两者并不相同。

查看您的代码,看起来您实际上不需要通用类,因为ComputerOrder只接受ComputerPart。你想要的是如下:

public class ComputerOrder extends GenericOrder<ComputerPart> {
    @Override
    public List<ComputerPart> getProducts() {
        return computerParts;
    }
}

答案 1 :(得分:4)

设计明智,我认为您应该重新考虑产品是否应该在GenericOrder类中。如果GenericOrder仅用于处理订单,那么在那里定义任何与产品相关的方法或字段可能没有意义。因为现在你在GenericOrder中有一个产品List数组没有被使用,因为你在ComputerOrder中定义了computerParts List数组。这会导致错误的代码。在这种情况下,您的类看起来像:

public class GenericOrder<T> {    
    private long orderNumber;
    private String orderType;
    private T theClass;

    public GenericOrder(String orderType) {
        this.orderType = orderType;
        orderNumber = System.currentTimeMillis();
    }
    public String getOrderType() {
        return orderType;
    }
    public long getOrderNumber() {
        return orderNumber;
    }
    public T get() {
        return theClass;
    }
    public void set(T theClass) {
        this.theClass = theClass;
    }
}

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

public class PartOrder<T> extends GenericOrder<T> {
    private List<T> parts = new ArrayList<T>();

    public PartOrder(String orderType) {
        super(orderType);
    }
    public void addProduct(T newProduct) {
        parts.add(newProduct);
    }
    public int getNumberOfProducts() {
        return parts.size();
    }
    public List<T> getProducts() {
        return parts;
    }
}

你会有一个像这样的ComputerPartOrder类:

public class ComputerPartOrder extends PartOrder<ComputerPart> {

    public ComputerPartOrder() {
        super("Computer Parts");
    }
}

否则,您也可以根据this stackoverflow post将GenericOrder.getProducts方法定义为抽象。

答案 2 :(得分:0)

实际上看起来你不希望你的GenericOrder<T>是通用的。 虽然ComputerOrder是通用的,并且可以是任何订单,ComputerPart(s)似乎特定于GenericOrder<ComputerPart>,并且应该扩展List<ComputerPart> getProducts()。 这样您只需要实现link: function(scope, element, attrs) { //body } ,您的代码就可以了。

答案 3 :(得分:0)

由于您的ComputerOrders类看起来更具体,请考虑重构您的代码,如下所示:

public class ComputerOrder extends GenericOrder<ComputerPart> { 

@Override 
public List<ComputerPart> getProducts() { return computerParts; }
 }
相关问题