2014-12-02 2 views
0

이것은 처음으로 상속을 처리하고 ArrayList 클래스의 하위 클래스를 만들려고하는데, 꽤 일찍 멈췄다. 내가 오류가 발생이 컴파일 할 때ArrayList 클래스 상속 문제 '정적 컨텍스트에서 비 정적 메서드 수신을 참조 할 수 없습니다.'오류

import java.util.ArrayList; 

/** 
* extending to ArrayList 
*/ 
public class SortedArrayList<E> extends ArrayList<E> 
{ 



/** 
* Inheriting the supers constructors 
*/ 
public SortedArrayList() 
{ 
    super(); 

    } 


public void add(){ 

    SortedArrayList.add(); // testing out inherited method. 
} 


    } 

그러나, 내가 잘못 뭐하는 거지

"비 정적 메서드 Add()는 정적 컨텍스트에서 참조 할 수 없습니다"?

답변

0

당신의 부모 클래스의 메소드를 호출하는 올바른 방법은 전화 ArrayList에는 인수 없음의 add 방법이 없습니다

super.add(); 
1

입니다. 있다면, super.add();이라고 쓰십시오. 그러나 super.add()을 호출하는 메서드를 재정의하는 것은 메서드를 재정의하지 않고 하위 클래스에서 메서드를 상속받는 것과 동일합니다. 문제의

@Override 
public void add(E e) { 
    // Write code here to find the index where it belongs, in an "index" variable. 
    // Then call super.add with the proper index so it remains sorted. 
    super.add(index, e); 
} 
0

커플 :

난 당신이 뭔가를 할 생각

오류 메시지가 당신에게 중요한 단서를 제공한다; 정적 멤버는 오브젝트 인스턴스가 아니라 클래스와 연관되어 있습니다. 일반적으로 수행 한 것처럼 클래스 이름을 참조하여 일반적으로 수행됩니다 (간단한 예제는 MyClass.myStaticMethod()). 그러나 귀하의 경우에는 add() 메서드가 정적이 아닙니다. 인스턴스 메서드입니다.

현재이 방법에서 무엇을 하려는지 명확하지 않습니다. 메서드 호출의 일부분 인 SortedArrayList을 제거하면 무한 재귀 루프가 종료됩니다. 반복적으로 자체를 호출하기 때문입니다.

수퍼 클래스의 add 메서드를 호출하려고한다고 가정하지만 메서드 서명이 없습니다. ArrayList add 메소드를 겹쳐 쓰려고 시도하는 경우 두 가지 버전이 있음을 유의해야합니다. 당신이이 메소드를 오버라이드 (override) 할 경우, 그들은 같은 서명을 포함, 더 같이해야한다 : 당신은 당신이 전화하는 SortedArrayList.add();을 쓸 때

First Version

public boolean add(E e){ 
    // your code 
} 

또는 second version

public void add(int index, E element){ 
    // your code 
} 
0

정적 메서드 "SortedArrayList"클래스의 "add"...하지만 존재하지 않습니다. 슈퍼 클래스 (비 정적)의 add() 메소드를 호출해야하는 경우 super.add()을 사용해야합니다.

2

스타일의 문제처럼 ... 나는 당신이 정말로 이것을하고 싶지 않다고 생각합니다.

ArrayList가 상속을 위해 문서화되어 있지만 이는 일반적이지 않습니다. 상속을 위해 명시 적으로 설계되지 않은 기본 클래스에서 패키지 경계를 넘어 서브 클래 싱하면 코드가 깨지기 쉽고 오류가 발생하기 쉽고 안전하지 않을 수 있습니다. 그 이유는 상속이 캡슐화를 깨뜨리기 때문입니다. 서브 클래스는 기본 클래스의 구현 세부 사항에 종속됩니다.

  • 는 ArrayList를 구현의 세부 사항을 확인합니다 ( 상속에 대한 문서화 및 설계) 대신

    • 서브 클래스 AbstractList를 : 새로운 코드를 작성하는 경우

      , 나는 하위 클래스의 ArrayList에 다음과 같은 문체 대안을 권장합니다 SortedArrayList를 private 필드 (즉, 상속을 통한 선호 구성)로 만듭니다. 기존 클래스에 계측을 추가하는 것은 일반적으로 포함 된 인스턴스에 대한 작성 및 전달 메소드 호출을 통해 가장 잘 수행됩니다.

    이러한 권장 사항은 Effective Java, 2nd Ed.

  • 관련 문제