我正在学习如何使用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的类实现,该类计算并返回矩形对象的区域。
答案 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];