Java 用泛型重写方法
我有一个名为GenericOrder的基类,可以用来创建任何类型产品的订单,然后我有更具体的订单子类。我的问题是我的ComputerOrder类和我正在重写的方法。这是基类代码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
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; }
}