对于回调中的循环

时间:2016-10-28 14:50:43

标签: java callback

我正在学习如何使用Java进行编码,并且在我正在使用的书中遇到了“使用回调接口”。有一个名为Data的类,它使用一个名为

的方法计算任何给定对象的度量的平均值
public static double max(Object[] objects, Measurer m)
{
    double largest = 0;
    for (Object obj : objects)
    {
        if(m.measure(obj) > largest)
        {
            largest = m.measure(obj);
        }
    }
    return largest;
}

这段代码工作得非常好,我确实理解它,但是,我尝试使用for (int i = 0; i < objects.length; i++)的普通for循环,并且我一直收到错误状态

  

“java.lang.ClassCastException:[Ljava.awt.Rectangle;不能转换为java.awt.Rectangle”。

这是我正在尝试使用的代码。

public static double max(Object[] objects, Measurer m)
{
    double largest = 0;
    for (int i = 0; i < objects.length; i++)
    {   
        double obj = m.measure(objects);
        if(m.measure(obj) > largest)
        {
            largest = m.measure(obj);
        }
    }
    return largest;
}

我的问题是这个异常真正意味着什么,有没有办法按照我想要的方式进行正常的for循环?我想使用普通的for循环只是因为它对我个人而言比增强循环更容易阅读;即使我知道增强循环更紧凑。

额外信息:此类称为Data,它使用Measurer类型,它是具有单个方法double measure(Object anObject)的接口,用于测量Object类型的对象。 Measurer接口由一个名为AreaMeasurer的类实现,该类计算并返回矩形对象的区域。

4 个答案:

答案 0 :(得分:1)

在这一行

OrderID
[Forms]![FMain_Orders]![OrderID]

Sum Of the Board Feet

Sum of the Board Price

您试图通过将对象表传递给它而不是单个对象来向obj变量分配mesaure方法的结果。我想你想做那样的事情:

double obj = m.measure(objects);

这是与每个循环完全相同的代码:

double obj = m.measure(objects[i]);

我认为你并不真正理解每个循环的工作方式。在您的示例中,obj变量每次都使用来自对象表的下一个值进行初始化。您可以将此变量标识为对象[i],其中i是循环执行次数。

答案 1 :(得分:0)

您需要让Object obj = objects[i];传递一组对象来测量方法(double obj = m.measure(objects);),并且需要删除此行。

public static double max(Object[] objects, Measurer m)
{
    double largest = 0;
    for (int i = 0; i < objects.length; i++)
    {   
        Object obj = objects[i];

        if(m.measure(obj) > largest)
        {
            largest = m.measure(obj);
        }
    }
    return largest;
}

答案 2 :(得分:0)

您收到异常是因为您将错误的对象类型传递给measure方法。 它期望Object,但您正在传递Object[]实例。

正常for循环i是数组中对象的索引 在测量它之前,你需要从数组中获取当前对象:

Object obj = objects[i];

然后你可以测量和比较。

答案 3 :(得分:0)

此异常实际上意味着在类measure的方法AreaMeasurer内某处,您传递的Object参数正在转换为java.awt.Rectangle

由于您将整个数组传递给方法,这可能意味着您传递的是java.awt.Rectangle[](例如,它被报告为[Ljava.awt.Rectangle;)。

要解决此问题,您应该遵循其他答案中给出的建议:

Object obj = objects[i];