我有一个名为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>
答案 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; }
}