ゴール
add
、、メソッドremove
などの配列の使いやすさを向上させるJavaクラスを作成していますcontains
。最善の解決策はArrayPP
、型パラメーターを持つクラス(と呼ばれる)を作成することだと思いましたT
。このようにして、ユーザーArrayPP
は同じタイプの配列を使用するのと同じくらい簡単にオブジェクトを操作できます。
問題
私はすぐadd
に、別の配列を作成する必要があり、ターゲット配列をsのt
配列からsの配列に変更するような方法を見つけました。ご想像のとおり、これはユーザビリティを完全に破壊します。T
Object
File[] f = new File[0];
ArrayPP<File> appF = new ArrayPP(f);
appF.add(saveFile);
f = appF.toArray();
プログラムはスローします
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.io.File;
これは、Javaコンパイラではジェネリック配列を作成できないため、add
メソッドは配列をsの配列に変更する必要があるためです(悪いですが、問題ありません)。行ごとのデバッグから、上記のコードが配列を保持していることがわかります。この場合は、メソッドの4行目が呼び出されるまでsの配列として保持されます。配列をsの配列ではなくsの配列に保つソリューションを誰かが持っていますか?Object
T[] t = new T[0];
T[] t = (T[]) new Object[0];
t
File
add
t
T
Object
サンプルコード
以下は私のクラスの非常に骨抜きにされたバージョンです。
public class ArrayPP<T>
{
T[] t;
/**
* Creates a new Array++ to manage the given array.
* <h3>Analogy:</h3>
* <tt>ArrayPP<String> s = new ArrayPP(args);</tt><br/>
* is analogous to<br/>
* <tt>String s[] = args;</tt>
* @param array The array to be managed
*/
public ArrayPP(T[] array)
{
t = array;
}
/**
* Appends a value to the end of the array
* @param val the value to be appended
* @return the resulting array.
*/
public ArrayPP add(T val)
{
T[] temp = (T[]) new Object[t.length + 1];
System.arraycopy(t, 0, temp, 0, t.length);
temp[temp.length - 1] = val;
t = (T[])temp;
return this;
}
/**
* Returns the array at the core of this wrapper
* @return the array at the core of this wrapper
*/
public T[] toArray()
{
return t;
}
}
考えられる解決策は?
ジェネリック配列に関する他の質問を見た後、私は解決策があると思います:
それ以外の
/**
* Appends a value to the end of the array
* @param val the value to be appended
* @return the resulting array.
*/
public ArrayPP add(T val)
{
T[] temp = (T[]) new Object[t.length + 1];
System.arraycopy(t, 0, temp, 0, t.length);
temp[temp.length - 1] = val;
t = (T[])temp;
return this;
}
これは機能しますか?
/**
* Appends a value to the end of the array
* @param val the value to be appended
* @return the resulting array.
*/
public ArrayPP<T> add(T val)
{
t = java.util.Arrays.copyOf(t, t.length + 1);
t[t.length - 1] = val;
return this;
}