Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用泛型重写方法_Java - Fatal编程技术网

Java 用泛型重写方法

Java 用泛型重写方法,java,Java,我有一个名为GenericOrder的基类,可以用来创建任何类型产品的订单,然后我有更具体的订单子类。我的问题是我的ComputerOrder类和我正在重写的方法。这是基类代码 import java.util.List; import java.util.ArrayList; public class GenericOrder<T> { private long orderNumber; private List<T> products; private T the

我有一个名为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;
}
}
import java.util.List;
导入java.util.ArrayList;
公共类GenericOrder{
私人长订单号;
私人上市产品;
私人T类;
公共通用订单()
{
products=新的ArrayList();
orderNumber=System.currentTimeMillis();
}
公共长getOrderNumber(){
退货订单号;
}
公共无效添加产品(T新产品){
产品。添加(新产品);
}
public int getNumberOfProducts(){
返回产品。大小();
}
公共列表产品()
{
退货产品;
}
公共产品(列出产品)
{
这一点。产品=产品;
}
公共部门得不到
{
返回类;
}
公共无效集(T类)
{
this.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;
}


}
import java.util.ArrayList;
导入java.util.List;
公共类ComputerOrder扩展了GenericOrder{
private List computerParts=new ArrayList();
私有字符串orderType=“计算机部件”;
公共秩序{
超级();
}
公共无效添加产品(计算机部件新产品){
计算机部件。添加(新产品);
}
公共字符串getOrderType(){
退货订单类型;
}
public int getNumberOfProducts(){
返回computerParts.size();
}
公共列表产品()
{
退回电脑零件;
}
}

我得到的错误是无法从
列表(ComputerPart)
转换到
列表
错误非常清楚:
getProducts()
声明返回一个
列表
,但您返回的是一个
列表
。我想我们都同意,这两者并不等同

查看您的代码,看起来您实际上不需要泛型类,因为
ComputerOrder
只接受
ComputerPart
s。您需要的是以下内容:

public class ComputerOrder extends GenericOrder<ComputerPart> {
    @Override
    public List<ComputerPart> getProducts() {
        return computerParts;
    }
}
公共类ComputerOrder扩展了GenericOrder{
@凌驾
公共列表产品(){
退回电脑零件;
}
}

实际上,您似乎不希望您的
计算机订单是通用的。
虽然
GenericOrder
是泛型的,可以是任何事物的顺序,
ComputerOrder
似乎特定于
ComputerPart
,应该扩展
GenericOrder

这样,您只需实现
List getProducts()
,您的代码就可以了。

从设计角度来看,我认为您应该重新考虑产品是否应该在GenericOrder类中。如果GenericOrder仅用于处理订单,那么在其中定义任何与产品相关的方法或字段可能没有意义。现在,您在GenericOrder中有一个产品列表数组,该数组没有被使用,因为您在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;
    }
}
公共类GenericOrder{
私人长订单号;
私有字符串orderType;
私人T类;
公共GenericOrder(字符串orderType){
this.orderType=orderType;
orderNumber=System.currentTimeMillis();
}
公共字符串getOrderType(){
退货订单类型;
}
公共长getOrderNumber(){
退货订单号;
}
公共部门得不到{
返回类;
}
公共无效集(T类){
this.theClass=类;
}
}

import java.util.ArrayList;
导入java.util.List;
公共类PartOrder扩展了GenericOrder{
private List parts=new ArrayList();
公共PartOrder(字符串orderType){
超级(订单类型);
}
公共无效添加产品(T新产品){
零件。添加(新产品);
}
public int getNumberOfProducts(){
返回零件。尺寸();
}
公共列表产品(){
返回部件;
}
}
你会有这样一个ComputerPartOrder类:

public class ComputerPartOrder extends PartOrder<ComputerPart> {

    public ComputerPartOrder() {
        super("Computer Parts");
    }
}
公共类ComputerPartOrder扩展了PartOrder{
公共计算机部分命令(){
超级计算机部件;
}
}

否则,您还可以根据将GenericOrder.getProducts方法定义为抽象

> P>计算机订单类看起来更具体,请考虑将代码重构如下:

public class ComputerOrder extends GenericOrder<ComputerPart> { 

@Override 
public List<ComputerPart> getProducts() { return computerParts; }
 }
公共类ComputerOrder扩展了GenericOrder{
@凌驾
public List getProducts(){return computerParts;}
}

你想让
getProducts
方法做什么?我想让getProducts方法告诉我computerOrder列表中存储了哪些对象。你的意思是
computerOrder扩展了GenericOrder
?@nickb是的,正确,我不记得确切的语法,谢谢:)谢谢。这个问题已经困扰我好几天了。
public class ComputerOrder extends GenericOrder<ComputerPart> { 

@Override 
public List<ComputerPart> getProducts() { return computerParts; }
 }