泛型比较ArrayList中的对象

时间:2014-10-15 18:45:28

标签: java object generics 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;     
    }

}

盒:

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());
    }
}

我遇到了一个问题,它说的是#34;类型为Measurable的方法getLargest(ArrayList)不适用于参数(ArrayList)&#34;但我不应该为getLargest类使用任何对象吗?

2 个答案:

答案 0 :(得分:0)

正如您所写,getLargest期望List中的对象传递给它以实现Measurable,但java.awt.Rectangle不会。

写作时

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

宣告T不同,但命名相同,与T类中的Measurable整体相同,这可能是导致完全混乱。

如果您确实在代码中将T替换为Rectangle,则可以看到您正在尝试调用Rectangle.getMeasure(),这是一种不存在的方法。< / p>

答案 1 :(得分:0)

我不确定泛型在哪里发挥作用。看起来你想要制作一堆从基类Measurable派生的形状。您还希望抽象类包含一些用于使用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;
    }
}