以下代碼使用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()
方法?
我應該相信像這樣的... 重寫的方法的返回類型允許爲重寫的方法的返回類型的子類型。
似乎沒有很好的理由宣佈'SubClass.list'作爲'List'(而不是'ArrayList')。 – 2012-04-13 02:48:16
@ MichaelBrewer-Davis - 當你直接使用'SubClass'而不是像SuperClass'那樣處理它時,它可以使事情變得更好。 – 2012-04-13 03:09:19
@Brendan - 我在談論(私有)成員變量過於籠統,而不是方法過於具體。方法中的協變是陽光和蝴蝶。 – 2012-04-13 15:13:39