2014-04-23 4 views
2

이것은 제가 잠시 동안 노력해 왔던 문제이며 거의 진행되지 않았습니다. ArrayList를 확장 할 때 추상 클래스를 사용하려고 할 때 많은 문제가 발생했습니다.Java에서 추상 클래스를 사용하여 ArrayList를 확장 하시겠습니까?

내 첫 번째 단계는 추상 클래스 GeometricObject의 모든 구체적인 하위 클래스 인 Circle, Rectangle 및 Triangle의 세 클래스를 정의하는 것이 었습니다. 기본 클래스는 해당 특정 객체에 대한 특정 getPerimeter()getArea() 수식을 사용하여 하위 클래스에서 재정의되는 추상 메서드 getArea()getPerimeter()을가집니다. 이 부분은 완료되었으며 의도 한대로 작동합니다.

다음 부분은 문제가있는 부분입니다. ArrayList<GeometricObject>을 확장하는 새로운 클래스 GeoemetricObjectList을 정의해야합니다. 이 클래스는 add(), remove()clear() 메소드를 재정의해야합니다. 이 클래스는 목록에있는 객체의 totalArea 및 totalPerimeter 변수를 유지합니다.

바로 지금 내가 정리하고 싶은 GeometricObjectList add() 메서드에서 매우 솔직하게, 지저분한 if 문 목록을 만들었습니다. 다음은 그 클래스에 대한 내 코드는 지금까지 있습니다 :

import java.util.ArrayList; 

@SuppressWarnings("hiding") 
public class GeometricObjectList<GeometricObject> extends ArrayList<GeometricObject>{ 

    final static long serialVersionUID = 1L; 

    public double totalArea = 0; 
    public double totalPerimeter = 0; 


    public boolean add(GeometricObject element){ 
     if(element instanceof Rectangle) { 
      totalArea += ((Rectangle)element).getArea(); 
      totalPerimeter += ((Rectangle)element).getPerimeter(); 
     } 
     if(element instanceof Circle) { 
      totalArea += ((Circle)element).getArea(); 
      totalPerimeter += ((Circle)element).getArea(); 
     } 
     if(element instanceof Triangle) { 
      totalArea += ((Triangle)element).getArea(); 
      totalPerimeter +=((Triangle)element).getArea(); 
     } 

     return super.add(element); 
    } 

    public boolean remove(GoemetricObject element) { 

     return super.remove(element); 
    } 

    public void clear() { 

    } 

} 

단순히 방법 getArea()이 형 GeometricObject에 대한 정의되지하지만 내 GeometricObject 클래스에서 내가 무시되는 공개 추상적 getArea()이 나는 ​​"이 오류가 totalArea += element.getArea()을 쓸 때 .. 각 콘크리트에서 getArea() 방법 (삼각형, 원, 사각형) 클래스

나의 다음 문제가 GeometricObjectList에서 remove() 방법입니다 그것은 다음과 같습니다

public boolean remove(GeometricObject element) { 

    return super.remove(element); 
} 

"이름 충돌 : GeometricObjectList<GeometricObject> 유형의 메소드 제거 (GeometricObject)가 ArrayList 유형의 remove (Object)와 동일한 지우지 만 무시하지는 않습니다"라는 오류가 발생합니다. add() 메서드를 만들 때이 오류가 발생하지 않았습니다.

이 문제에 대한 도움은 정말 감사하겠습니다. 더 많은 정보가 필요하다면 요청하면됩니다.

+2

@SuppressWarnings ("hiding")? – Hannes

+1

@Override 주석을 잊어 버렸습니다. – Hannes

+0

문제의 일부는 'public class GeometricObjectList '가 GeometricObject라는 * type 매개 변수를 선언한다는 것입니다. 나는 당신이'public 클래스 GeometricObjectList extends ArrayList '라고 가정합니다. –

답변

2

당신은 정말 여러 가지 문제가 있었다 - 맞춤법과 숨어 포함하여,

// Make sure you have these methods in your GeometricObject. 
// private static abstract class GeometricObject { 
// public abstract double getArea(); 
// public abstract double getPerimiter(); 
// } 

// Do not use that annotation. It was warning you! 
public class GeometricObjectList extends 
    ArrayList<GeometricObject> { 

    final static long serialVersionUID = 1L; 

    public double totalArea = 0; 
    public double totalPerimeter = 0; 

    public boolean add(GeometricObject element) { 
    if (element != null && super.add(element)) { 
     totalArea += element.getArea(); // add area 
     totalPerimeter += element.getPerimiter(); // add perimeter 
     return true; 
    } 
    return false; 
    } 

    public boolean remove(GeometricObject element) { // Spelling! 
    if (element != null && super.remove(element)) { 
     totalArea -= element.getArea(); // subtract area 
     totalPerimeter -= element.getPerimiter(); // subtract perimeter 
     return true; 
    } 
    return false; 
    } 

    public void clear() { 
    super.clear(); 
    } 
} 
+0

OP는이 목록에 사용자 지정 기능을 추가하려고합니다 : "이 클래스는 목록에있는 개체의 totalArea 및 totalPerimeter 변수를 유지합니다". –

+0

+1 주요 문제는 type 매개 변수가'GeometricObject' 클래스 유형과 동일한 이름이라고 생각합니다. – frozenkoi

+0

이것은 도움이되었습니다! 나는 타입 매개 변수로 계속 비린내가있는 것으로 생각했습니다. 이 물건은 나에게 여전히 새롭다. 그래서 나는 "<>"의 분리 된 세트가했던 것과 약간 혼란스러워했다. – user3562973

2

그럼, 먼저 첫 번째 것들로 시작하자.

public class GeometricObjectList<GeometricObject> extends ArrayList<GeometricObject> 

자바는 형식 매개 변수GeometricObject을 치료한다 :

이 클래스 선언은 당신이 일을 믿을 일을하지 않습니다. 당신이 원하는 경우 GeometricObject의 인스턴스 엄격 일반을 결합하는이 해당 서명을 변경 :

public class GeometricObjectList<T extends GeometricObject> extends ArrayList<T> 

그런 다음 자바 GeometricObject와 자식의 수 인스턴스 유형 매개 변수 T를 식별합니다.

또한 모두 제네릭 형식 인수에 대한 필요성을 피하고 가질 수 귀하의 ArrayList 단단히 일반적인없이 GeometricObject에 바인딩 :

public class GeometricObjectList extends ArrayList<GeometricObject> 

다음, add의 서명이 변경 가져옵니다. T은 이미 GeometricObject의 인스턴스로 바인딩되어 있으므로 추가 할 내용을 명시 적으로 말할 필요가 없습니다.

public boolean add(T element) 

당신이 T를 사용하지 않기로 경우에, 당신은 동일한 서명을 유지하는 것입니다.

두 경우 모두 캐스트가 중복되어 사라질 수 있습니다.

마지막으로 remove 메서드는 상속 된 remove을 재정의하지 않습니다. 서명도 일치해야합니다.

public boolean remove(Object element) 
관련 문제