2

ジェネリックコレクションのデータ型チェックはどのように行われますか?たとえば、以下のArrayListを見てください。

ArrayList<String> r1 = new ArrayList<String>(); 
r1.add("4");
r1.add("1");
r1.add("2");
r1.add("3");

メソッドにどのようにArrayList<String>リンクされていadd()ますか?コレクションではない独自のクラスを作成する場合、厳密な型チェックが確実に行われるように、genericsパラメーターをどのように結び付けるのですか?

AsyncTaskクラスを使用してAndroidで観察した別の例:

private class SomeAsyncTask extends AsyncTask<String, Integer, Long> {

ここで、Stringは入力を示し、Integerは進行状況を示し、Longは応答を示します。このマッピングはどこで行われますか?独自のジェネリッククラスを作成するにはどうすればよいですか?また、このマッピングをどこで定義しますか?

4

3 に答える 3

3

私の意見では、ジェネリックスはあまりにも幅広い主題であり、対応として適切にカバーすることはできません。必要なすべての情報については、Oracleのチュートリアル(ここ)を参照することから始めることをお勧めします。

とはいえ、簡単な答えとして、Androidのドキュメント.add()によると、このメソッドはジェネリックパラメーターを取ります。これは、リストの作成時に指定されたパラメーターと同じです。この場合、これは文字列です。E

次に、独自のジェネリッククラスを作成するには、次のようにするのと同じくらい簡単です。

public MyClass<T>
{
    private T myT;

    public void set(T t)
    {
        this.myT = t;
    }

    public T get()
    {
       return this.myT;
    }
}

上記の場合、Tは汎用パラメータを参照します。このパラメータは、クラスをインスタンス化するときに設定されます(など)... new MyClass<String>();

于 2012-08-06T13:27:26.010 に答える
3

メソッドを持つジェネリッククラスを作成する場合は、次のdoSomethingように記述できます。

class GenericClass<E> {
    public void doSomething(E aThing) {
       //do something with aThing
    }
}

これで、配列リストのように使用できます。

GenericClass<String> myGeneric = new GenericClass<String>();
myGeneric.doSomething("abc");

GenericClass<Integer> myGeneric2 = new GenericClass<Integer>();
myGeneric.doSomething(123);

ここで、ArrayListの実装方法について詳しく知りたい場合は、コードを確認するのが最善の方法です。

于 2012-08-06T13:27:33.423 に答える
2

最初の質問

Javaのジェネリック型チュートリアルをご覧ください。例はこれを明確にするかもしれません:

public class Tuple<X, Y> {

   X first;
   Y second;

   public Tuple(X first, Y second) {
      this.first = first;    
      this.second = second;
   }
}

このクラスをインスタンス化するとき、たとえば次の行でインスタンス化できます。

Tuple<String, Integer> tuple = new Tuple<String, Integer>("Hello", 1);

StringコンストラクターはnowとIntegerasパラメーターを(この順序で)期待しているため、型パラメーターのチェックはコンパイル時にここで行われます。

2番目の質問

タプルの例で、さまざまなジェネリック型パラメーター名を使用して、マッピングを実行する方法がすでに明確になっていることを願っています。

AsyncTaskタイプパラメータ定義の場合も同じです。たとえば、異なる名前が使用されます。AsyncTask<A, B, C>したがって、それぞれを適用するときに区別できます。

そのためには、クラスが次のように定義されているAsyncTaskのソースコードを見てください。

public abstract class AsyncTask<Params, Progress, Result>

タイプパラメータ名は1文字である必要はなく、完全な名前にすることもできます。

于 2012-08-06T13:27:13.853 に答える