我对接口的理解是它们不能包含方法定义,只能包含签名和常量声明。我有一个包含接口对象集合的arraylist。在这种情况下,它看起来像:
列表与LT; StoreItem> items = new ArrayList< StoreItem>();
和StoreItem是我的界面,如下所示:
public interface StoreItem {
//Operations
public String getMaker();
public Patron getItemBuyer();
public Date getManufactureDate();
public String getManufacturer();
public String getProductName();
public void setItemBuyer(Patron purchase);
}
我有一种创建新项目的方法并将其添加到列表中。它似乎工作正常,因为我没有在单元测试中遇到任何问题,也没有发现异常。但是我有那个经典的新手问题,我想打印arraylist以亲眼看到内容,我明白我需要覆盖StoreItem的toString方法。但StoreItem是一个界面,显然它不会让我在界面中做这样的事情。我还有一个实现此接口的抽象类,以及该抽象类的三个子类。我正在创建这些子类之一的对象作为StoreItem,所以我尝试在此子类中执行toString覆盖。我不能让这个工作。我试过了:
public String toString(){
return super.productName();
}
它不喜欢,因为在抽象超类productName中是私有的,并且需要为项目着想。我决定继续将productName更改为受保护,只是为了看看它是否仍然有用。打印列表时,我仍然只是获取内存位置(类似于@ d9sdf83j)。所以我把它设置回私有并尝试让toString在返回时使用超类中的getter方法,所以:
public String toString(){
return super.getProductName();
}
我仍然只是获取内存位置。我不知道这是否足以描绘正在发生的事情和我正在尝试做的事情。我希望这个错误很简陋,比我更聪明的人可以发现它并指出它,但我可以在必要时添加更多代码。提前谢谢。
我仍然无法让它发挥作用。我将添加实际的类,看看是否有帮助。
public abstract class AbstractStoreItem implements StoreItem{
//attributes
private String product;
private Date manufactureDate;
private String manufacturer;
private String distibutor;
private Patron buyer;
//operations
public AbstractStoreItem(String product, String manufacturer, String distibutor, Date manufactureDate) {
this.product = product;
this.manufactureDate = manufactureDate;
this.manufacturer = manufacturer;
this.distibutor = distibutor;
}
@Override
public String toString() {
return this.product;
}
@Override
public String getManufacturer() {
// TODO Auto-generated method stub
return manufacturer;
}
@Override
public Patron getBuyer() {
// TODO Auto-generated method stub
return buyer;
}
@Override
public Date getManufactureDate() {
// TODO Auto-generated method stub
return manufacturerDate;
}
@Override
public String getDistributor() {
// TODO Auto-generated method stub
return distributor;
}
@Override
public String getProduct() {
// TODO Auto-generated method stub
return product;
}
@Override
public void setBuyer(Patron buyer) {
this.buyer= buyer;
}
}
这是抽象类的子类。这是我要添加到列表中的对象:
public class Widget extends AbstractStoreItem{
//attributes
private Type type;
private int unitQuantity;
//operations
public Widget(String product, String manufacturer, String distributor, Date manufactureDate, Type gearType, int unitQuantity){
super(product, manufacturer, distributor, manufactureDate);
this.type = gearType;
this.unitQuantity = unitQuantity;
}
public Type getType(){
return type;
}
public int getUnitQuantity(){
return unitQuantity;
}
@Override
public void setBuyer(Patron Buyer) {
// TODO Auto-generated method stub
}
@Override
public String toString() {
return super.getManufacturer();
}
}
不确定如何处理toString方法。
答案 0 :(得分:0)
您需要覆盖实施toString
的类中的StoreItem
,其中您要添加到List
interface StoreItem {
String name();
}
static class Pen implements StoreItem {
@Override
public String name() {
return Pen.class.getName();
}
@Override
public String toString() {
return "Pen to String";
}
}
public static void main(String[] args) {
List<StoreItem> items= new ArrayList<StoreItem>();
items.add(new Pen());
System.out.println(items);
}
将打印
[Pen to String]