2

私はJavaのインターフェースを理解しようとしており、スタックしているこのタスクを実行しています。それは簡単なことに違いありませんが、解決策が見えないようです。インターフェイスにはいくつかのメソッドが含まれており、このセットのすべての要素がセット内にもある場合、そのうちの 1 つが true を返す必要があります。いえ

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

インターフェイスは、クラスの概念のようなものです。

メソッド定義、静的変数、最終変数などが含まれます。

したがって、それらを実装するクラスには本体 (つまり、このクラスでそのメソッドを処理する方法) が含まれます。

たとえば。

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 implements で問題ありません。

また、このメソッドの実行方法が混乱しているように見えるので、追加します

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

インターフェイスは、具体的なクラスが他のクラスと共有するインターフェイス(関数プロトタイプ)を定義するクラスです。インターフェイスのインスタンスはありませんが、具体的なクラスISet iset = new myClass()のインスタンスは、たとえば myClass のインスタンスを作成したことを意味します(具体的) しかし、タイプ ISet の変数は参照を保持しています。これは、ポリマーフィズムのために可能です。myClassが提供するプロトタイプの定義を提供しているため ですISetiset.isSubsetOf(...)ISet にはメソッド プロトタイプが 1 つしかないため、ポリモーフィズムの助けを借りて呼び出すことができます。

同様に、そのようにできるポリモーフィズムの助けを借りて

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

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

解決しました。問題は ArrayList の Integers にありました。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 に答える