2016-10-28 5 views
0

Я изучаю код в 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++) и я постоянно получаю сообщение об ошибке, которое утверждает

«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; 
} 

Мой вопрос, что же это на самом деле означает исключение, и есть способ сделать это, как я хотел, чтобы с нормальным для цикла? Я хотел бы использовать обычный цикл для цикла, потому что его немного легче читать для меня лично, чем расширенный цикл; хотя я знаю, что расширенный цикл более компактен.

Дополнительная информация: Этот класс называется Data и использует тип Measurer, который представляет собой интерфейс с одним методом double measure(Object anObject) для измерения объектов типа Object. Интерфейс Measurer реализуется классом AreaMeasurer, который вычисляет и возвращает область объекта прямоугольника.

ответ

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; 
} 
+0

Вы, кажется, отсутствует 'objects.get (I)', который необходим для получения правильного объекта на каждой итерации , –

0

Вы получаете исключение, потому что вы передаете неправильный тип объекта к методу measure. Он ожидает Object, но вы проходите мимо Object[] экземпляра.

В нормальном для цикла i - это индекс объекта в массиве.
Вы должны получить текущий объект из массива, прежде чем измерить его, как это:

Object obj = objects[i]; 

Затем вы можете измерить и сравнить.

1

В этой строке

double obj = m.measure(objects); 

вы пытаетесь присвоить переменной OBJ результат метода mesaure пропусканием таблицы объектов к нему, вместо одного объекта. Я полагаю, что вы хотели сделать что-то вроде этого:

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

Это код ведьма делает точно так же, как это с для каждого цикла:

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

Я думаю, что вы на самом деле не понимаю путь для каждого цикла. В вашем примере переменная obj инициализируется следующим значением из таблицы объектов каждый раз. Вы можете идентифицировать эту переменную как объекты [i], где i - число циклов.

0

Это исключение на самом деле означает, что где-то внутри метода measure класса AreaMeasurer, тем Object параметр вы передаете преобразовывается к java.awt.Rectangle.

Поскольку вы передаете весь массив методу, это, вероятно, означает, что вы передаете java.awt.Rectangle[] (за исключением сообщения [Ljava.awt.Rectangle;).

Чтобы исправить это, вы должны следовать советам в другие ответы:

Object obj = objects[i]; 
Смежные вопросы