gpt4 book ai didi

java - 为什么没有找到方法?

转载 作者:行者123 更新时间:2023-12-02 10:27:18 24 4
gpt4 key购买 nike

您好,我创建了一个对象,但编译器找不到它的方法。

测试类:

public class TestStockItemSubclasses{
public static void main(String[] args) {
StockItem[] itemArray = new StockItem[2];
itemArray[0] = new MouseMat("A colorful black mouse mat", 499, 10);
itemArray[1] = new MouseMat("A really fake mouse mat", 299, 10);

for(StockItem item : itemArray){
testItem(item);
}//for
}//main

private static void testItem(StockItem item){
if(item instanceof TextDescriptionStockItem){
testDescription(item);
}//if
}//testItem

private static void testDescription(StockItem item){
item.setDescription("A really fake but colorful black mouse mat");
System.out.printf("%-99s%-2s%n", "change description of the item", "||");
System.out.printf("%-99s%-2s%n", item, "||");
}//
}//TestStockItem

这是我运行的类,我得到以下输出:

$ javac TestStockItemSubclasses.java
TestStockItemSubclasses.java:58: error: cannot find symbol
item.setDescription("A really fake but colorful black mouse mat");
^
symbol: method setDescription(String)
location: variable item of type StockItem
1 error


其他类:
MouseMat 类:

public class MouseMat extends TextDescriptionStockItem{
public MouseMat(String description, int price, int quantity){
super(description, price, quantity);
}//MouseMat

@Override
public String getStockType(){
return "Plain blue cloth, foam backed";
}//getStockType
}//class


TextDescription类:

public abstract class TextDescriptionStockItem extends StockItem{
private String description;
public TextDescriptionStockItem(String description, int price, int amount){
super(price, amount);
this.description = description;
}//TestDescriptionStockItem

@Override
public String getDescription(){
return description;
}//getDescription

public void setDescription(String description){
this.description = description;
}//setDescription

}//class


StockItem 类:

public abstract class StockItem{
private static int stockCodeCount = 0;
private final int stockCode;
private int price;
private int quantity;

public StockItem(int price, int quantity){
this.price = price;
this.quantity = quantity;
stockCode = ++stockCodeCount;
}//constructor


public int getStockCode(){
return stockCode;
}//getStockCode

public abstract String getStockType();

public abstract String getDescription();

public String toString(){
return "SC" + getStockCode() + ": " + getStockType() + ", "
+ getDescription() + " (" + getQuanityInStock() + " @ "
+ getPriceExVat() + "p/" + getPriceIncVat() + "p)";
}

}//class


一些信息:
MouseMat 类扩展了 TextDescription 类
TextDescription 类扩展了 StockItem 类
setDescription方法位于TextDescription类中
MouseMat对象被赋值给StockItem对象
请问为什么找不到setDescription方法?谢谢。

最佳答案

您检查您的StockItem是否是TextDescriptionStockItem:

  private static void testItem(StockItem item){
if(item instanceof TextDescriptionStockItem){
testDescription(item);
}//if
}//testItem

但随后您声明您的方法通常采用 StockItem:

private static void testDescription(StockItem item){

由于此方法现在声明它适用于所有 StockItem,因此它无法调用 TextDescriptionStockItem 特定方法。

您应该明确指出此方法需要一个带有描述的项目:

private static void testDescription(TextDescriptionStockItem item){

然后通过强制转换项目来相应地调用它,因为您已经验证了它的类型正确:

  private static void testItem(StockItem item){
if(item instanceof TextDescriptionStockItem){
testDescription((TextDescriptionStockItem) item);
}//if
}//testItem
<小时/>

请注意,像这样使用 instanceof 有点代码味道。很可能,由于您的 TestStockItemSubclasses 类似乎假定它处理的所有项目都是 TextDescriptionStockItem 而不仅仅是 StockItem,因此它应该显式声明这一点通过在各处使用 TextDescriptionStockItem 来代替。

这样做的好处是编译器可以在编译时检查您的对象,而不必在运行时执行 instanceof 。如果有人向您的数组添加一个非描述性的 StockItem,编译器会说这不起作用,而不是您当前的代码默默地跳过该项目(“猜猜它一定是免费的!”,hurr)呵呵)。

关于java - 为什么没有找到方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com