JAVA Реализация интерфейса с методами, которые принимают и возвращают интерфейс типа - PullRequest
0 голосов
/ 05 сентября 2018

Я столкнулся с проблемой. Я должен реализовать этот интерфейс:

public interface Set_of_objects {
    boolean equal(Set_of_objects s);
    Set_of_objects cross(Set_of_objects s);
}

Класс, реализующий его, должен взять массив объектов и протестировать его с другим массивом объектов. Метод «равно» должен возвращать истину, если они равны (ложь, если они не равны), а метод «крест» должен возвращать массив объектов, состоящий из объектов, которые они разделяют.

Я не смог выяснить, как даже сравнить эти 2 массива из-за типа аргумента, требуемого в методе.

public class Object_array_test implements Set_of_objects {
    Object[] x = new Object[5];

    public Object_array_test (Object[] x) {
        this.x = x;
    }
    public boolean equal(Set_of_objects s) {
        return  s.equals(x);
    }
    public cross(Set_of_objects s) {
        return null;
    }
}

Когда я делаю это так, он говорит: «Невероятный тип аргумента для equals (): кажется, что Object [] не связан с Set_of_objects»

И когда я пытаюсь кастовать (как я видел в интернете):

Object[] y = (Object[]) s;

Я понял это: "Невозможно привести от Set_of_objects к Object []"

Как мне решить эту проблему, и кто-нибудь может объяснить, как она работает? Спасибо и извините за глупый вопрос.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Здесь, кажется, есть несколько незначительных проблем. Вот обновленный интерфейс:

package com.simi.practice.work.PracticeWork;
import java.util.*;
import java.lang.*;


public interface Set_of_objects {

        boolean equals(Object[] x, Object[] y);

        Object cross(Object[] x, Object[] y);

        }

В исходном интерфейсе вы не передавали массив как объект. Вы просто передавали интерфейс «тип». Вы должны передать фактический объект Array, однако, чтобы передать Array любому из ваших методов или конструкторов в вашем классе. Мы можем передать объект x и объект y в интерфейс, и любой класс, реализующий интерфейс, очевидно, будет использовать эти методы:

package com.simi.practice.work.PracticeWork;
import java.util.*;
import java.lang.*;

public class Object_array_test implements Set_of_objects{


    public boolean equals(Object[]s, Object[]t) {
        String v = Arrays.toString(s);
        String r = Arrays.toString(t);

        if(v.equals(r)) {

          return true;
         }

         return false;

      }
    public Object[] cross(Object[]s, Object[]t) {
        ArrayList<Object> n = new ArrayList<Object>();
        for(int x= 0; x<s.length; x++) {
           if(s[x].equals(t[x])) {
              n.add(s[x]);

           }
        }System.out.println(n.toArray());
        Object[] p = n.toArray();
        System.out.println(Arrays.toString(p));
        return  p;
    }

 }

В приведенном выше коде вы не знаете, какой тип объекта вы передадите, поэтому мы конвертируем его в строку. Как я отмечал ранее, методы должны принимать Object в качестве аргумента для работы с массивами. Просто передать интерфейс «тип» не будет работать. Затем в методе .equals () мы можем сравнить два массива, чтобы увидеть, идентичны ли они. если нет, код вернет false. Если они идентичны, код вернет true.

И, наконец, давайте проверим класс и вывод:

public class App {
        public static void main(String... args) throws IOException, MyException{

        Object_array_test test = new Object_array_test();
        Object[] i = {1, 2, 3, 4};
        Object[] j = {1, 2, 90, 4};
        System.out.println(test.equals(j, i));
        System.out.println(test.cross(i,  j));

     }
 }

Как видите, эти два массива не равны, и код возвращает значение false. Мы также создали новый массив из списка Array, который возвращает одинаковые числа в Array. Мы возвращаем новый объект, который мы создали, и выводим его на консоль.

А вот ваш вывод:

false
[Ljava.lang.Object;@7852e922
[1, 2, 4]
[Ljava.lang.Object;@4e25154f
0 голосов
/ 05 сентября 2018

A. Просто попробуйте прочитать ваши требования снова (и медленно :-)):

  1. Класс, реализующий его, должен принимать массив объектов

  2. метод "cross" должен возвращать массив объектов

так ... ни

boolean equal(Set_of_objects s);

ни

Set_of_objects cross(Set_of_objects s);

удовлетворяет вашим требованиям - Set_of_objects это не массив , а просто объект, реализованный Set_of_objects интерфейс.

подписи методов вашего интерфейса должны выглядеть так:

public interface Set_of_objects {
   boolean equal(Set_of_objects[] s);
   Set_of_objects[] cross(Set_of_objects[] s);
}

B. Из других рук вы можете использовать Set_of_objects в качестве держателя для массива, как и вы ... но вам нужен другой метод (для получения вашего массива, например, getX()) и использовать его для сравнения членов массива ...

P.S. Я думаю, вы поймете, как пройти через массив для сравнения объектов и поместить их в другой, чтобы вернуться из метода cross.

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...