0

指定されたリンク リストから偶数の長さの文字列を削除するために、このコードに出くわしました。イテレータ オブジェクトがキーワードitrでインスタンス化されない理由がわかりません。newここにコードがあります..

public static void removeEvenLength(List<String> list) {
     Iterator<String> itr= list.iterator();
     while (itr.hasNext()) {
         String element=itr.next();
         if (element.length()%2==0) {
             i.remove();
     }
   }
}       

ここで、イテレータ メソッドはであり、その としてnewをstatic返すだけということですか。シングルトンコンストラクター以外のJavaで同様のインスタンス化方法が発生する例を1つ以上提供してもらえますか。ありがとうございましたiterable objectlistfield

4

3 に答える 3

9

ここで、反復子メソッドは静的であり、リストをフィールドとして新しい反復可能なオブジェクトを返すだけということですか。

いいえ、インスタンスメソッドです。への参照を返すだけIterator<String>です。iterator()そのため、メソッドの本体にはステートメントが含まれている可能性がありますnew(ただし、別のものを呼び出す可能性はあります)。今のところ、イテレータとジェネリックから離れてみましょう - 同様の状況は次のとおりです。

class Bar {}

class Foo {
    Bar createBar() {
        return new Bar();
    }
}

public class Test {
    public static void main(String[] args) {
        Foo foo = new Foo();
        Bar bar = foo.createBar();
    }
}

同じパターン: 異なる型の新しいインスタンスを返すインスタンス メソッド。

于 2013-07-18T21:31:05.703 に答える
1

すべてのオブジェクトがキーワードで明示的に作成されるわけではありません。newメソッドは、新しいオブジェクトを内部的に作成し、それに何らかの処理を行って、それを返すことができます。

反復子の型に応じて、List通常はプライベートな内部クラスでItrあり、ArrayList で呼び出されます。でインスタンス化されiterator(ます。たとえばArrayList、そのメソッドは次のようになります。

public Iterator<E> iterator() {
    return new Itr();
}

実装する他のクラスListは、別のプライベート内部クラスを使用するか、特定の (通常は jre 以外の) 実装で匿名クラスを使用することができます。

于 2013-07-18T21:32:08.940 に答える
1

list.iterator型ではなく、メソッド内でインスタンス化されたオブジェクトを返すメソッドであるため、 new 演算子でインスタンス化されません。そのメソッドの戻り値に割り当てられるだけです。

于 2013-07-18T21:32:12.727 に答える