次のコードは、Javaでのメソッドオーバーライドの概念を使用しています。
package pkg;
import java.util.ArrayList;
import java.util.List;
abstract class SuperClass
{
abstract public List<String>getList();
}
final class SubClass extends SuperClass
{
private List<String>list=null;
@Override
public ArrayList<String> getList()
{
list=new ArrayList<String>();
list.add("A");
list.add("B");
return (ArrayList<String>) list;
}
}
final public class Main
{
public static void main(String[] args)
{
SuperClass s=new SubClass();
List<String>list=s.getList();
for(String str:list)
{
System.out.println(str);
}
}
}
慣例により、メソッドのオーバーライドでは、スーパークラスとサブクラスの両方で同じシグニチャ(リターンタイプ)が使用されます。上記のコードでは、getList()
メソッドの戻り型はSuperClass
isList
であり、そのサブクラスでは戻り型はArrayList
です。ここでメソッドのオーバーライドはどのように機能しますか?
ちなみに、これがインターフェースArrayList
の実装であることは明らかですが、コンパイラーはメソッドList
をオーバーライドしながら、ここで戻り型をどのように処理しますか?getList()
このようなことを信じるべきですか...オーバーライドされたメソッドの戻り型は、オーバーライドされたメソッドの戻り型のサブタイプであることが許可されています。