次のコードでは、Javaでのメソッドのオーバーライドという概念を使用しています。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);
}
}
}
慣例として、メソッドのオーバーライドでは、スーパークラスとサブクラスの両方で同じシグネチャ(戻り値付き)が使用されます。上記のコードでは、SuperClass
のgetList()
メソッドの戻り値の型はList
であり、戻り値の型はArrayList
です。メソッドオーバーライドはどのように機能しますか?ところで
は、それがArrayList
がList
インタフェースの実装であることは明らかですが、getList()
メソッドをオーバーライドしながら、どのようにコンパイラが、ここで戻り値の型を扱うのですか?
このようなものを信じるべきでしょうか... オーバーライドされたメソッドの戻り値の型は、オーバーライドされたメソッドの戻り値の型のサブタイプにすることができます。
(むしろ 'ArrayList'より)' List'として 'SubClass.list'を宣言するためには良い理由があるようですません。 –
@ MichaelBrewer-Davis - 'SuperClass'のように扱うのではなく、' SubClass'を直接使用しているときには、より良いものにすることができます。 –
@Brendan - 私は(プライベート)メンバー変数があまりにも一般的であり、メソッドがあまりにも具体的ではないと話していました。メソッドの共分散は日照と蝶です。 –