0

簡単な質問があります。

ネストされたクラスとして、独自に定義されたリンクされた Node を使用してクラスを定義しています。

この Node は、ジェネリック型ではなく、String の ArrayLists の Node にのみ使用したい。

ジェネリック型 T、つまり HNode< T> の Node を定義しましたが、ArrayList のメソッドを使用するこの Node クラスにメソッドを追加したいと考えています。例えば、

    public void forward(int n) { //return boolean??
        HNode<T> targetNode;
        for(int i=0; i<n; i++) {
            targetNode = this._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));
    }

私のNodeクラス内。

メソッド size() が T 型に対して未定義であるという警告が表示され続けるため、クラス定義を String の ArrayList の Node に変更することを検討しています。

(最初の質問はこれです:)それは正しいアプローチですか、それとももっと良い方法はありますか?? または、使用している限り、警告を無視できますか

もう一つの質問はこれです。変数 targetNode を宣言し、for ループ内に割り当てました。ただし、targetNode を割り当てる必要があるという警告がスローされます。

    public void forward(int n) { //return boolean??
        HNode<T> targetNode = this;
        for(int i=0; i<n; i++) {
            targetNode = targetNode._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));

これはより良いオプションでしょうか?

ありがとうございました!!

4

3 に答える 3

1

それを行うためのより良い方法があります!

.size()のメソッドを使用したいのでArraylist、ノード (およびそれを包含するクラス) をCollectionインターフェースのタイプにすることをお勧めします。

Collectionインターフェイスは、オブジェクトがメソッドを実装していることを保証し、これ.size()によりコンパイル エラーが解消されます。

Arraylistは次のように継承さCollectionれます。
Collection-->AbstractList-->Arraylist

クラスを介してCollectionジェネリックの代わりに使用します。T

HNode<Collection> targetNode;

Collectionこれにより、クラスは、幅広いクラスのグループであるインターフェイスを実装するすべてのクラスを処理できます。これにより、抽象化が維持され、コードの再利用性が大幅に向上し、クラス全体をArraylist

于 2013-03-30T21:23:42.537 に答える
0

「このノードは、ジェネリック型ではなく、String の ArrayLists のノードにのみ使用したい」

次に、そのようなタイプを作成し、ジェネリックを削除して、次を使用します: HNode の代わりにHNode<T>

type のフィールドを作成しますArraylist<String>

于 2013-03-30T21:23:35.160 に答える
0

List インターフェイスのメソッドを使用できるようにするには、置き換えるだけです

HNode<T> 

HNode<List>

n=0 の場合、for ループが実行されないため、「targetNode を割り当てる必要があります」という警告が表示されます。そのため、targetNode が割り当てられない場合があります。そのため、範囲チェックを追加する必要があります。そうしないと、この行で NullPointerException が発生する可能性があります

targetNode._datum.add(this._datum.remove(this._datum.size()-1));

編集:また、最後の行が論理的に間違っているようです。remove() メソッドは、削除されたオブジェクト自体ではなく、操作の結果 (ブール値) を返します。削除する前にこの要素を明示的に取得するか、コレクションを LinkedList に変更して removeLast() メソッドを呼び出す必要があります。

于 2013-03-30T21:34:20.990 に答える