有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承JAVA实现接口,方法采用并返回类型接口

我遇到了一个问题。 我必须实现这个接口:

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

实现它的类必须获取一个对象数组,并用另一个对象数组对其进行测试。如果它们相等,则方法“equal”应返回true(如果它们不相等,则返回false),而方法“cross”必须返回由它们共享的对象组成的对象数组

由于方法中需要的参数类型,我甚至无法找出如何比较这两个数组

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()不太可能的参数类型:对象[]似乎与\u对象的集合\u无关”

当我试着选角时(就像我在网上看到的):

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

我明白了: “无法从\u对象集\u强制转换为对象[]”

我如何解决这个问题,有人能解释一下它到底是如何工作的吗? 谢谢你,很抱歉问了这个愚蠢的问题


共 (2) 个答案

  1. # 1 楼答案

    这里似乎有一些小问题。以下是更新的界面:

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

    在原始接口中,没有将数组作为对象传递。您只是传递了一个接口“type”。但是,为了将数组传递给类中的任何方法或构造函数,必须传递实际的数组对象。我们可以在接口中传递一个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;
        }
    
     }
    

    在上面的代码中,您不知道将传递哪种类型的对象,这就是我们将其转换为字符串的原因。正如我前面提到的,这些方法需要将一个对象作为参数来处理数组。简单地传递接口“type”将不起作用。在公园里。方法,然后我们可以比较这两个数组,看看它们是否相同。否则,代码将返回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。我们还从一个数组列表创建了一个新数组,该数组列表返回数组中相同的数字。我们返回已创建的新对象,并将其打印到控制台

    这是您的输出:

    false
    [Ljava.lang.Object;@7852e922
    [1, 2, 4]
    [Ljava.lang.Object;@4e25154f
    
  2. # 2 楼答案

    只要试着把你的要求再读一遍(慢慢地:-):

    1. The class implementing it has to take an array of objects

    2. method "cross" has to return an array of objects

    所以。。。都不是

    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作为数组的持有者,就像你所做的那样。。。但是您需要另一个方法(数组的getter,例如getX()),并使用它来比较数组成员

    另外,我猜您将了解如何通过数组循环来比较对象,并将它们放入另一个数组中以从cross方法返回

    另外,在现实世界中,不建议从方法返回数组的新实例。。。但作为锻炼,这并不重要

    祝你好运