2

我正在尝试理解 Java 中的接口,并有这个任务要做,我是一个堆栈。这一定很容易,但我似乎没有看到解决方案。接口包含一些方法,如果这个集合的所有元素也在集合中,其中一个应该返回 true。IE

public interface ISet{
//some methods
   boolean isSubsetOf(ISet x);
}

然后上课:

public class myClass implements ISet{
       ArrayList<Integer> mySet;
       public myClass{
          mySet = new ArrayList<Integer>();
        }
       //some methods
       public boolean isSubsetOf(ISet x){
          //method body
    }
 }

我需要在方法体中写什么?如何检查 myClass 的实例是否是 ISet 集合的子集?我试图投射,但它给出了一个错误:

ArrayList<Integer> param = (ArrayList<Integer>)x;
    return param.containsAll(mySet);
4

4 回答 4

0

如何检查 myClass 的实例是否是 ISet 集合的子集

使用instanceOf

if(myClass instanceOf ISet){...}

于 2012-12-09T11:02:23.830 回答
0

接口是一个类,它定义了具体类与其他类共享的接口(函数原型)。不能有接口的实例,但具体类的实例ISet iset = new myClass()意味着你已经创建了 myClass 的实例(具体)但 ISet 类型的变量持有引用。由于多态性,这是可能的。因为 myClass正在提供原型的定义,由ISet. 借助多态性,您只能调用iset.isSubsetOf(...),因为 ISet 只有一个方法原型。

同样,在多态性的帮助下,您可以这样做

ISet set1 = new myClass()
ISet set2 = new myClass()

set1.isSubsetOf(set2 );
于 2012-12-09T11:04:52.473 回答
0

接口就像一个类的概念。

它包含诸如方法定义以及静态和最终变量之类的内容。

因此,任何实现它们的类都将包含一个主体(即在此类中处理该方法的一种方式)。

例如。

public interface ISet{
    boolean isSubsetOf(ISet x);
}

现在任何实现它的类都将“处理”方法 isSubsetOf 并返回一个布尔值。他们如何做到这一点不是接口业务。现在在你的课上

public class myClass implements ISet{
   ArrayList<Integer> mySet;
   public myClass(){
      mySet = new ArrayList<Integer>();
    }

   public boolean isSubsetOf(ISet x){
      //you now have to get what type of object x is
      // it is obviously implementing ISet therefore it most probably be myClass.
      //So when you typecast the object it should typecast to myClass.
      ArrayList<Integer> param = (ArrayList<Integer>)( ((myClass)x).mySet );
      return param.containsAll(mySet)
    }
}

当我们将 x.mySet 类型转换为 ArrayList 并将 x 本身类型转换为 myClass 时,这将起作用。

但是,逻辑上有一个缺陷。如果您有另一个实现 ISet 的类,那么它们可能不会类型转换为 myClass 但在这种情况下,使用 on 实现会很好。

您似乎也对如何运行此方法感到困惑,所以我将添加

myClass A=new myClass();
A.add(1);    A.add(2);    A.add(3);
myClass B=new myClass();
B.add(3);    B.add(1);    B.add(2);   B.add(4);
A.isSubsetOf(B);
//This will answer true
于 2012-12-09T11:51:58.323 回答
0

解决了。问题出在整数的 ArrayList 中 - 我试图使用 containsAll() 方法,这并不适合。我使用循环来检查是否可以在主集中找到子集的每个元素。还有一个单独的 find 方法,它将查找单个元素。

public boolean isSubsetOf(ISet x){
    myClass set = (myClass)x;
    boolean found = false;
    for (int element : mySet){
        found = false;
        if (set.find(element)){
            found = true;
        }
    }
    return found;

}

于 2012-12-09T12:00:23.313 回答