Search code examples
javainheritanceabstract-classabstract-methods

Understanding abstract classes and methods and overriding them properly


I have an abstract class called Answer. It needs to be abstract because hypothetically, there can be many different types of Answers such as String answers, video answers, audio answers, etc.

public abstract class Answer {

abstract public void display();

abstract public Answer getAnswer();

abstract public boolean isEqual();

}

Now in StringAnswer, I want to override these methods.

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 is giving me problems because I'm trying to return a String, but it's expecting an Answer back. In the abstract sense, I want to return an Answer. However, the content of StringAnswer is obviously going to be a String.

So, how do I return it as a String when it's expecting an Answer?


Solution

  • You don't. You fix your design.

    I suspect what you might want is something like

    abstract class Answer<T> {
      public abstract T getAnswer();
    }
    
    public class StringAnswer extends Answer<String> {
      public String getAnswer() { ... }
    }