2013-09-29 5 views
2

나는 다음과 같은 자바 코드가 : 그 같은 수의 매개 변수가 있어야합니다 슈퍼 클래스의 서브 클래스를 의미합니까 ... "생성자 지정된 형태에 적용 할 수 없습니다"생성자를 주어진 유형에 적용 할 수 없습니까?

public class WeirdList { 
    /** The empty sequence of integers. */ 
    /*ERROR LINE */ public static final WeirdList EMPTY = new WeirdList.EmptyList(); 

    /** A new WeirdList whose head is HEAD and tail is TAIL. */ 
    public WeirdList(int head, WeirdList tail) { 
     headActual = head; 
     tailActual = tail; 
    } 
    /** Returns the number of elements in the sequence that 
    * starts with THIS. */ 
    public int length() { 
     return 1 + this.tailActual.length(); 
    } 

    /** Apply FUNC.apply to every element of THIS WeirdList in 
    * sequence, and return a WeirdList of the resulting values. */ 
    public WeirdList map(IntUnaryFunction func) { 
     return new WeirdList(func.apply(this.headActual), this.tailActual.map(func)); 
    } 

    /** Print the contents of THIS WeirdList on the standard output 
    * (on one line, each followed by a blank). Does not print 
    * an end-of-line. */ 
    public void print() { 
     System.out.println(this.headActual); 
     this.tailActual.print(); 
    } 

    private int headActual; 
    private WeirdList tailActual; 
    private static class EmptyList extends WeirdList { 

     public int length() { 
      return 0; 
     } 
     public EmptyList map(IntUnaryFunction func) { 
      return new EmptyList(); 
     } 
     public void print() { 
      return; 
     } 
} 

그리고 오류가 계속를 수퍼 클래스로 생성자에서? 나는 한 시간 동안 벽에 머리를 두드렸다.

+0

'EmptyList' 내부 클래스는 생성자가 없습니다. _somehow_ _a_ 부모 클래스 생성자를 호출하는 데 필요한 생성자입니다. 기본 상위 생성자가 없기 때문에 내부 클래스 _must_는 _a_ 상위 생성자를 수동으로 호출합니다. 'WeirdList'의 생성자는'head'와'tail'의 타입이 다르며'EmptyList'에도 분명히없는 꼬리가 필요하다는 점에서 이상합니다. 나는'EmptyList'가'implement' 할 수있는'interface'를 사용하고 더 감각적 인 WeirdList 생성자를 사용하도록 제안 할 것입니다. – pickypg

답변

6

하위 클래스에는 "수퍼 클래스와 같은 생성자에서 동일한 수의 매개 변수"를 가진 생성자가있을 필요가 없지만 에서 자체 생성자의 수퍼 클래스 생성자 중 일부를 호출해야합니다.

슈퍼 클래스에 인수가없는 생성자가있는 경우 수퍼 클래스 생성자에 대한 명시 적 호출이 생략되거나 서브 클래스에 명시 적 생성자가 전혀없는 경우 (기본적으로) 호출되지만 슈퍼 클래스 인수가없는 생성자가 없으므로 컴파일이 실패합니다.

private EmptyList() { 
    super(0, null); 
} 

또한 당신의 클래스를 모두 대신 상속 추상 슈퍼 클래스가 더 좋은 생각이 될 수 있지만, 그 선택의 :

당신은 당신의 EmptyList이 뭔가를 추가 할 수 있습니다.

2

EmptyList에 기본 no-arg 생성자가 있지만 명시 적으로 호출 할 수있는 수퍼 클래스에는 생성자가 없으므로 인수가없는 생성자를 WeirdList에 명시 적으로 추가해야합니다.

0

어떤 방법을 호출 할 때 호출과 호출자는 매개 변수와 반환 유형을 일치시켜야합니다. 생성자가있는 특별한 경우는 컴파일러가 빈 생성자를 삽입하지 못하게하는 경우입니다. Weird() {}는 클래스를 오버로드하고 많은 생성자를 가질 수 있습니다. 실행되는 생성자는 동일한 서명 즉 유형이있는 생성자입니다. 당신이 시도하고있는 것은 이미 LinkedList, Vector, List java 클래스에있는 java에 내장 된 것을 수행하는 것입니다.

관련 문제