0

我有一个名为 Answer 的抽象类。它需要是抽象的,因为假设可以有许多不同类型的答案,例如字符串答案、视频答案、音频答案等。

public abstract class Answer {

abstract public void display();

abstract public Answer getAnswer();

abstract public boolean isEqual();

}

现在在 StringAnswer 中,我想重写这些方法。

public class StringAnswer extends Answer
{
String text;

public StringAnswer(String text)
{
    this.text = text;
}

@Override
public void display()
{
    System.out.println(text);
}

@Override
**public String getAnswer()
{
    return text;
}**

@Override
public boolean isEqual()
{
    // TODO Auto-generated method stub
    return false;
}
}

getAnswer 给我带来了问题,因为我试图返回一个字符串,但它期待一个答案。在抽象意义上,我想返回一个答案。但是,StringAnswer 的内容显然会是一个字符串。

那么,当它期待一个答案时,我如何将它作为字符串返回?

4

4 回答 4

7

你没有。你修复你的设计。

我怀疑你可能想要的是类似的东西

abstract class Answer<T> {
  public abstract T getAnswer();
}

public class StringAnswer extends Answer<String> {
  public String getAnswer() { ... }
}
于 2012-10-19T03:22:55.297 回答
1

当你覆盖一个方法时,你有这个规则(来自其他规则):

返回类型必须与被覆盖方法中的返回类型相同或子级。

鉴于此,String不会 extends Answer,因此您的getAnswer覆盖将是错误的。

您有两种方法来修复该方法:

//1st way
@Override
public Answer getAnswer() {
    return this;
}

//2nd way
@Override
public StringAnswer getAnswer() {
    return this;
}

你应该选择你的方式(提示:改变我对覆盖方法的实现!)。

于 2012-10-19T03:23:03.510 回答
1

这就是通用的用途。您可以在此处查看手册:

http://docs.oracle.com/javase/tutorial/java/generics/

于 2012-10-19T03:23:37.067 回答
1

首先,您需要了解抽象类和接口之间的区别。接口指定类必须实现的属性或方法的列表。这可能更适合您的示例。抽象类指定一些功能,通常带有一些具体的实现,然后是一些类似于接口的抽象方法,必须实现。

由于您没有在基类中添加任何功能,因此我建议使用接口

于 2012-10-19T03:23:41.667 回答