JAVA使用带有和返回类型接口的方法实现接口

时间:2018-09-05 11:01:36

标签: java inheritance methods types interface

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

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

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

由于该方法所需的参数类型,我甚至无法弄清楚如何比较这两个数组。

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 :(得分:0)

A。只需尝试重新阅读您的要求(然后慢慢地:-)):

  
      
  1. 实现它的类必须采用对象的数组

  2.   
  3. 方法“交叉”必须返回对象的数组

  4.   

所以...都不是

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方法返回。

此外,在现实世界中,不建议从方法中返回数组的新实例...但是作为练习,它并不太重要。

祝你好运!

答案 1 :(得分:0)

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

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 Object才能将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;
    }

 }

在上面的代码中,您不知道将传递哪种对象,这就是我们将其转换为String的原因。如前所述,这些方法需要使用Object作为参数才能使用Arrays。简单地传递接口“类型”是行不通的。然后,在.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。我们还从“数组”列表中创建了一个新数组,该数组返回与“数组”中相同的数字。我们返回创建的新对象,并将其也打印到控制台。

这是您的输出:

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