2014-09-17 2 views
0

여기에서 문제와 가능한 설명을 지적 할 수 있다면 큰 도움이 될 것입니다.ArrayList 및 다형성

class Parent{}  
public class ChildClass extends Parent{ 
    /*Main class*/  
    public static void main(String[] args) { 

     ArrayList<ChildClass> a3 = new ArrayList<ChildClass>(); 
     foo(a3);  
    } 
    /*another function*/ 
    static void foo(ArrayList<Parent> obj) {  
} 

다음과 같은 컴파일 오류가 발생합니다.

The method foo(ArrayList<Parent>) in the type ChildClass is not applicable for the arguments (ArrayList<ChildClass>) 

다형성 규칙에 따라 수행 할 수 있어야합니다. 권리? 모든 ChildClass는 IS-A 부모입니다. 무슨 문제가있는 것 같습니까?

+0

'static void foo (ArrayList obj) {}'를 대신 입력하십시오. –

+0

감사합니다.하지만 왜 컴파일되지 않았는지에 대한 설명을 원했습니다. – Ekta

답변

5

ChildClass은 -Parent이지만, ArrayList<ChildClass>ArrayList<Parent>이다. 위의 코드는 오류없이 컴파일 일어난 경우

ArrayList<ChildClass> a3 = new ArrayList<>(); 
foo(a3); 
ChildClass c = a3.get(0); 

... 

static void foo(ArrayList<Parent> obj) { 
    obj.add(new Parent()); 
} 

, 그것은 형식 안전하지 않을 수 실제로 ClassCastException와 런타임에 실패 :이 코드를 고려하면 이유, 그것은 분명 갈까요.

그래서, 관계에 대해 "ArrayList<ChildClass>입니다-A ArrayList<Parent>"실제로 이해하려면 다음 두 가지 사실을 동시에 진실해야합니다 :

  1. ChildClass 것은-A Parent;
  2. Parent은 -ChildClass입니다.

일반적으로 ChildClassParent과 동일한 유형 인 경우에만 다른 이름으로 적용 할 수 있습니다. 따라서 우리는 자바가 적용하는 실제 규칙 인 불변량에 도달합니다. 그 중 하나는 ArrayList<ChildClass>ArrayList<Parent>이고, ArrayList<Parent>ArrayList<ChildClass>입니다.

+0

따라서 전체적인 요점은 ArrayList 은 오직 부모만을 취할 것이고 ArrayList 도 마찬가지입니다. 값을 팝업 할 때 어떤 객체가 추출되는지 알지 못하기 때문입니다. 권리? 추신 위의 코드는 또한 내 일식에서 나를 위해 컴파일되지 않습니다. 어쨌든 나는 요점을 얻었다. – Ekta

+0

'ArrayList '에 자식을 추가 할 수는 있지만, 'ArrayList '을 기대하는 메소드에는'ArrayList '을 전달할 수 없습니다. 컴파일에 관해서는 두 가지 코드 스 니펫이며 컴파일하지 않습니다. 첫 번째 부분을 메소드 (예 :'main')에 포함시켜야합니다. –