다음 코드는 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')로이 보인다. –
@ MichaelBrewer-Davis -'SuperClass'처럼 취급하는 대신'SubClass'를 직접 사용하면 더 좋게 만들 수 있습니다. –
@Brendan - 저는 (개인) 멤버 변수가 너무 일반적이어서 메서드가 너무 구체적이지는 않습니다. 방법의 공분산은 햇빛과 나비입니다. –