2014-10-15 5 views
1

배열 목록의 객체를 비교하고 가장 큰 것을 반환하는 제네릭 클래스를 만들려고합니다. 제 문제는 제네릭이 어떻게 작동하는지 완전히 이해하고 있는지 잘 모르겠습니다.ArrayList의 객체를 비교하는 일반 사항

측정 :

import java.util.ArrayList; 

/** 
    Describes any class whose objects can be measured. 
*/ 

public abstract class Measurable<T>{ 

abstract double getMeasure(); 

    public static <T extends Measurable<T>> T getLargest(ArrayList<T> objects){ 
     T largest = objects.get(0); 
     for(int i = 0; i < objects.size(); i ++){ 
      if(largest.getMeasure() == objects.get(i).getMeasure()){ 
       largest = objects.get(i); 
      } 
     } 
     return largest;  
    } 

} 

상자 : 나는 (그것을 측정 유형의 방법 getLargest (ArrayList에)가 인수 적용 할 수 없습니다 "라는 문제를 가로 질러 간다

import java.awt.Rectangle; 
import java.util.ArrayList; 


public class Box extends Measurable { 

    private Rectangle box; 
    private static ArrayList<Rectangle> rectangles; 

    public Box(){ 
     box = new Rectangle(); 
     rectangles = new ArrayList<Rectangle>(); 
    } 

    public ArrayList<Rectangle> create(){ 
     for(int i = 0; i < 10; i++){ 
      box = new Rectangle((int) Math.random(), (int) Math.random()); 
      rectangles.add(box); 
     } 
     return rectangles; 
    } 

    @Override 
    public double getMeasure() { 
     double area = 0; 
     for(int i = 0; i < rectangles.size(); i++){ 
      area = rectangles.get(i).getWidth()*rectangles.get(i).getHeight(); 
     } 
     return area; 
    } 

    public static void main(String[] args){ 
     Box b = new Box(); 
     b.getLargest(b.create()); 
    } 
} 

ArrayList) "하지만 getLargest 클래스에 대한 객체를 사용할 수 없어야합니까?

+0

당신이'ArrayList'는 측정 클래스를 확장 객체를 포함하는 것으로 예상,'Rectangle'는 – hoaz

+0

왜'Measureable'는 형식 매개 변수'T'가 않습니다를 확장하지 않는 이유는 무엇입니까? 그것은 클래스 정의에서 어디에도 사용되지 않는 것 같습니다. – newacct

답변

0

당신이 그것을 쓴 바와 같이, getLargest는 객체 Measurable을 구현하기 위해 List에 전달 기대하지만, java.awt.Rectangle하지 않습니다.

당신은 다른있는 T을 선언하지만 총 혼란으로 이어질 가능성이 전체적으로으로 Measurable 클래스의 T로, 같은 이름이

public static <T extends Measurable<T>> T getLargest(ArrayList<T> objects){ 

을 쓸 때.

코드에서 실제로 TRectangle으로 바꾸면 존재하지 않는 방법 인 Rectangle.getMeasure()을 호출하는 중임을 알 수 있습니다.

+0

좋습니다. java.awt.Rectangle을 참조하고 있기 때문에 Measurable을 사용하지 않습니다. 따라서 Rectangle을 객체로 사용하려면 Measurable을 참조하는 자체 Rectangle 클래스를 만들어야합니다. – user2782582

+0

아니면'Measurer' 클래스를 작성해도 괜찮습니다.이 클래스는'getMeasure (T t)'메소드를 가지고 있습니다. 이 경우에 더 의미가있을 수 있습니다. –

0

제네릭이 어디서 나올지 잘 모르겠습니다. 측정 가능한 기본 클래스에서 파생 된 여러 모양을 만들고 싶습니다. 추상 클래스가 Measurable 서브 클래스 작업을위한 코드를 보유하기를 원할 수도 있습니다. 기본적으로 Measurable을 구현하는 하위 클래스를 만들어야합니다. 아래처럼 Box 클래스를 원한다고 생각합니다.

public class Box extends Measurable { 

    private double width; 
    private double height; 

    public Box(double width, double height){ 
     this.width = width; 
     this.height = height; 
    } 

    public double getMeasure() { 
     double area = width*height; 
     return area; 
    } 
} 
관련 문제