この質問をしているのを見つけた以前のすべての投稿を読みましたが、この課題で行っていることに適用できるものはありませんでした。まず、配列を使用する必要があります。次に、ジェネリック配列を含むクラスが他のクラスによってアクセスされ、使用されています。だから私は次のようなものをコンパイルすることができますが:
T[] arr = (T[]) new Object[15];
このデータ構造を使用する他のクラスを実行しようとすると、キャストできないというエラーが表示されます。
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; can
not be cast to [Ljava.lang.Comparable;
私が読んだ解決策または回避策のほとんどは、Array.newInstance() を使用してクラスを作成し、それをジェネリック型 T[] としてキャストしていました。私が直面している問題は、このメソッドで使用するクラスがわからないことです。コンストラクターには何も渡されません。
私の最初の回避策は、配列を文字列としてインスタンス化し、T[] にキャストすることでした。これは機能し、クラスがコンパイルされ、小さなドライバーが完全に実行されました。しかし今、私は新しいデータ構造を使用する別のクラスを作成しており、それがこのデータ構造に取り込まれます。配列に何かを追加しようとすると壊れます。
Exception in thread "main" java.lang.ArrayStoreException: DATATYPE
エラーは、これを元のクラスの配列に追加しようとしたときの行を示しています。
store[length] = item;
item は add メソッドに次のように渡されます。
T item
ここに欠けているものはありますか?T[] としてキャストしてから、一般的なアイテム T で埋めることができると思いました。
編集:これは add メソッドとクラスの関連部分です:
public class AThreadedBSTree<T extends Comparable<? super T>> implements
ThreadedBSTreeInterface<T>, Cloneable
{
public void add(T item)
{
ensureCapacity();
store[length] = item;
}
}
これは、さまざまなデータ構造で add メソッドをテストするために使用しているコードです。
public class Driver
{
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
Datatype test = new Datatype(in);
AThreadedBSTree<Datatype> tree = new AThreadedBSTree<Datatype>();
tree.add(test);
}
}