我有一个名为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的内容显然是一个String。
那么,当它期待答案时,如何将其作为字符串返回?
答案 0 :(得分:7)
你没有。你修复了你的设计。
我怀疑你可能会想要的是
abstract class Answer<T> {
public abstract T getAnswer();
}
public class StringAnswer extends Answer<String> {
public String getAnswer() { ... }
}
答案 1 :(得分:1)
当你覆盖一个方法时,你有这个规则(来自其他规则):
返回类型必须与重写方法中的返回类型相同或是子类。
鉴于此,String
不会延伸Answer
,因此您的getAnswer
覆盖会出错。
您有两种方法可以修复该方法:
//1st way
@Override
public Answer getAnswer() {
return this;
}
//2nd way
@Override
public StringAnswer getAnswer() {
return this;
}
你应该选择你的方式(提示:改变我的覆盖方法的实现!)。
答案 2 :(得分:1)
这就是通用的用途。您可以在此处查看手册:
答案 3 :(得分:1)
首先,您需要了解抽象类和接口之间的区别。接口指定类必须实现的属性或方法的列表。这可能更适合您的示例。抽象类指定一些功能,通常带有一些具体的实现,然后是一些类似于接口的抽象方法,必须实现。
由于您没有在基类中添加任何功能,我建议使用接口