4

私はJavaジェネリックを学んでおり、演習として開発したコードを適応させようとしています。

特に、ArrayVisualizerSedgewickのStdDrawライブラリを使用して、動的配列の動作を視覚化およびアニメーション化するクラスを開発しました。私はジェネリックスをサポートする独自の動的配列クラスを持っており、ArrayVisualizerこの配列に類似したものに使用法を拡張しようとしています。

要するに、私の質問は、他のジェネリック型を含むジェネリック型をどのように扱うことができるかということです。

これが私の思考プロセスです:

  • 私はこのインターフェースを作ることから始めました:
public interface IterableCollection<Item> {
    void add(Item i);

    Item get(int index) throws IndexOutOfBoundsException; // These can be slow for LinkedList implementations
    void set(int index, Item value) throws IndexOutOfBoundsException;

    int capacity();
    int size(); // Capacity and size can be the same for LinkedList implementations
}
  • 次に、ArrayVisualizerこのインターフェイスを実装するクラスをパラメータとして使用するようにします。少しグーグルした後、私はあなたが書くことができないことに気づきました
public class ArrayVisualizer<T implements IterableCollection<?> >

ただし、extendsを使用する必要があります。

ただし、関数内でTクラスを使用できないと書いても。

たとえば、この関数を一般化しようとすると、コンパイラエラーが発生します。

public static void draw(T<String> vector) throws Exception 

Tもジェネリックであることを指定する必要があるようですが、それを宣言する方法が見つかりません。私は以下を試しましたが、どれも機能しません:

public class ArrayVisualizer<T<?> implements IterableCollection<?> >
public class ArrayVisualizer<T<S> implements IterableCollection<S> >

リソース:参照として、動作中の非ジェネリックバージョンのコードをアップロードしました。

  • DynamicArray.java

  • ArrayVisualizer.java(これは入力としていくつかの間隔のある文字列を取ります)

  • InteractiveArrayVisualizer.java(これではセルの値を選択できませんが、次の空の場所をクリックしてセルを埋めることができ、最後に開いたセルをクリックしてセルを空にすることができます。これは、デバッグヘルパーを使用するためのものです。動的配列のサイズ変更の問題の場合)。

4

1 に答える 1

4

クラスでは、コレクションタイプと要素タイプの両方を指定するArrayVisualizer必要があります。Javaではそのように定量化することはできません。T<String>(他の言語はそれを行うことができますが、Javaはできません。)

だから、のようなもの...

class ArrayVisualizer<E, T extends IterableCollection<E>> {
  public void draw(T vector) { ... }
}

(私があなただったとしても、私は自分のインターフェースではなく、事前に構築されたインターフェースIterableまたはインターフェースを使用しようとします...)CollectionIterableCollection

于 2012-08-24T16:49:10.543 に答える