0

Javaジェネリックプログラミングを使用してクラスを実装することと、型を一般的なオブジェクトクラスとして保持することの間に、大きな利点/欠点があるかどうか疑問に思っていましたか? たぶん、以下のコードは私が探しているものを明確にしますか?

この最初のコードは、一般的な Object クラス型を使用してリストを実装する方法を示しています。

public class myList {
private static int DEFAULT_CAPACITY = 16;
private int size, capacity;
private Object[] dataArray;

myList(){
    this(DEFAULT_CAPACITY); 
}
myList(int defaultSize){
    capacity = defaultSize;
    size = 0;
    dataArray =new Object[defaultSize];
}
public int getSize(){return size;}
public void insert(int loc, Object o){
    if (size+1 <= capacity){
        for (int i=size; i> loc-1; i--)
            dataArray[i] = dataArray[i-1];
        dataArray[loc-1] = o;
        size++;
    }
}
public Object getItem(int loc){
    return dataArray[loc-1];
}
}

次のコードは、Java 汎用プログラミングを使用した同じ機能を示しています。

public class MyList<E> {
private int size = 0;
private static final int DEFAULT_CAPACITY = 10;
private Object dataArray[];

public MyList() {
   dataArray = new Object[DEFAULT_CAPACITY];
}

public void insert(int loc, E e) {
if (size+1 <= capacity){
   for (int i=size; i> loc-1; i--)
    dataArray[i] = dataArray[i-1];
   dataArray[loc-1] = e;
   size++;
}
}
public E get(int loc) {
   return (E) elements[loc-1];
}
} 
4

4 に答える 4

3

Genericこのアプローチの利点は次のとおりです。
のリストを作成するとしますInteger
このGenericアプローチでは、リストに何か他のものを入れようとすると、コンパイル時にエラーが発生します。
このアプローチでは、このエラーはruntimeObjectまで表示されません。これは、非常に見つけにくいバグのレシピです。

于 2012-10-31T09:10:33.640 に答える
1

まず、ジェネリックMyList<E>の dataArray がジェネリックである必要があります。

class MyList<E> {
     private E dataArray[];
     public MyList(Class<E> c,int size) {
         dataArray  = (E[]) Array.newInstance(c,size);
    }
 }

利点-リストは本質的にタイプセーフであるため、一般的なオブジェクトタイプでは、並べ替えなどの操作を行うときに問題を引き起こす可能性のあるタイプを追加できます...

于 2012-10-31T09:13:13.370 に答える
1

あなたのためにこれを分割させてください.......

- Genericsクラス、インターフェース、メソッド、フィールドに実装できますが、最も重要な用途Collection 型を安全にすることです。

-これはCollections、Java でタイプ セーフを作成する方法であるため、間違ったタイプが Collection に入ることはありません。コレクションは時間内にのみチェックされ、その間はチェックされないため..つまり、Cat オブジェクトはタイプの Collection に入ってはなりません。犬。CompilationRuntime

-として知られるプロセスがあります。コンパイラは、コンパイル時Erasureに Generics クラスから型パラメータと型引数を削除し、実行時に生の型にします。書かれたコードとの下位互換性を維持するためです。ジェネリックなし。

例えば:

Box<String> になる Box

于 2012-10-31T09:19:04.190 に答える
0

重要なキーワードは「契約による設計」です。ジェネリックを使用すると、コンパイル前であっても、「このリストの要素にはこの型があります」という契約を検証できます。必要なのは、抽象構文ツリーだけです。型検証は、強く型付けされた言語の主な利点です。

また、コードの補完と屈折が容易になります。

于 2012-10-31T09:48:12.367 に答える