Index: lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java	(révision 1404044)
+++ lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java	(copie de travail)
@@ -146,7 +146,7 @@
 
     @Override
     public Iterator<String> iterator() {
-      return new FilterIterator<String>(super.iterator()) {
+      return new FilterIterator<String, String>(super.iterator()) {
         @Override
         protected boolean predicateFunction(String field) {
           return hasField(field);
Index: lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java	(révision 1404044)
+++ lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java	(copie de travail)
@@ -1568,7 +1568,7 @@
         List<StorableField> storedList = new ArrayList<StorableField>();
         
         @Override
-        public Iterable<? extends IndexableField> indexableFields() {
+        public Iterable<IndexableField> indexableFields() {
           if (list.size() == 0) {
             list.add(new IndexableField() {
               @Override
@@ -1596,7 +1596,7 @@
         }
 
         @Override
-        public Iterable<? extends StorableField> storableFields() {
+        public Iterable<StorableField> storableFields() {
           return storedList;
         }
         
Index: lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java	(révision 1404044)
+++ lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java	(copie de travail)
@@ -185,7 +185,7 @@
 
       IndexDocument d = new IndexDocument() {
         @Override
-        public Iterable<? extends IndexableField> indexableFields() {
+        public Iterable<IndexableField> indexableFields() {
           return new Iterable<IndexableField>() {
             @Override
             public Iterator<IndexableField> iterator() {
@@ -230,7 +230,7 @@
         }
 
         @Override
-        public Iterable<? extends StorableField> storableFields() {
+        public Iterable<StorableField> storableFields() {
           return new Iterable<StorableField>() {
             @Override
             public Iterator<StorableField> iterator() {
Index: lucene/core/src/test/org/apache/lucene/util/TestFilterIterator.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/util/TestFilterIterator.java	(révision 1404044)
+++ lucene/core/src/test/org/apache/lucene/util/TestFilterIterator.java	(copie de travail)
@@ -39,7 +39,7 @@
   }
 
   public void testEmpty() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return false;
@@ -49,7 +49,7 @@
   }
     
   public void testA1() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return "a".equals(s);
@@ -61,7 +61,7 @@
   }
     
   public void testA2() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return "a".equals(s);
@@ -73,7 +73,7 @@
   }
     
   public void testB1() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return "b".equals(s);
@@ -85,7 +85,7 @@
   }
     
   public void testB2() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return "b".equals(s);
@@ -97,7 +97,7 @@
   }
     
   public void testAll1() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return true;
@@ -113,7 +113,7 @@
   }
     
   public void testAll2() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return true;
@@ -126,7 +126,7 @@
   }
 
   public void testUnmodifiable() {
-    final Iterator<String> it = new FilterIterator<String>(set.iterator()) {
+    final Iterator<String> it = new FilterIterator<String, String>(set.iterator()) {
       @Override
       protected boolean predicateFunction(String s) {
         return true;
Index: lucene/core/src/java/org/apache/lucene/document/Document.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/document/Document.java	(révision 1404044)
+++ lucene/core/src/java/org/apache/lucene/document/Document.java	(copie de travail)
@@ -138,9 +138,8 @@
   */
   public final BytesRef[] getBinaryValues(String name) {
     final List<BytesRef> result = new ArrayList<BytesRef>();
-    Iterator<Field> it = storedFieldsIterator();
-    
-    while (it.hasNext()) {
+
+    for (Iterator<StorableField> it = storedFieldsIterator(); it.hasNext(); ) {
       StorableField field = it.next();
       if (field.name().equals(name)) {
         final BytesRef bytes = field.binaryValue();
@@ -163,9 +162,7 @@
   * @return a <code>BytesRef</code> containing the binary field value or <code>null</code>
   */
   public final BytesRef getBinaryValue(String name) {
-    Iterator<Field> it = storedFieldsIterator();
-    
-    while (it.hasNext()) {
+    for (Iterator<StorableField> it = storedFieldsIterator(); it.hasNext(); ) {
       StorableField field = it.next();
       if (field.name().equals(name)) {
         final BytesRef bytes = field.binaryValue();
@@ -235,9 +232,8 @@
    */
   public final String[] getValues(String name) {
     List<String> result = new ArrayList<String>();
-    Iterator<Field> it = storedFieldsIterator();
-    
-    while (it.hasNext()) {
+
+    for (Iterator<StorableField> it = storedFieldsIterator(); it.hasNext(); ) {
       StorableField field = it.next();
       if (field.name().equals(name) && field.stringValue() != null) {
         result.add(field.stringValue());
@@ -260,9 +256,7 @@
    * the actual numeric field instance back, use {@link #getField}.
    */
   public final String get(String name) {
-    Iterator<Field> it = storedFieldsIterator();
-    
-    while (it.hasNext()) {
+    for (Iterator<StorableField> it = storedFieldsIterator(); it.hasNext(); ) {
       StorableField field = it.next();
       if (field.name().equals(name) && field.stringValue() != null) {
         return field.stringValue();
@@ -288,29 +282,28 @@
 
   /** Obtains all indexed fields in document */
   @Override
-  public Iterable<? extends IndexableField> indexableFields() {
-    return new Iterable<Field>() {
+  public Iterable<IndexableField> indexableFields() {
+    return new Iterable<IndexableField>() {
       @Override
-      public Iterator<Field> iterator() {
+      public Iterator<IndexableField> iterator() {
         return Document.this.indexedFieldsIterator();
       }
     };
   }
 
-
   /** Obtains all stored fields in document. */
   @Override
-  public Iterable<? extends StorableField> storableFields() {
-    return new Iterable<Field>() {
+  public Iterable<StorableField> storableFields() {
+    return new Iterable<StorableField>() {
       @Override
-      public Iterator<Field> iterator() {
+      public Iterator<StorableField> iterator() {
         return Document.this.storedFieldsIterator();
       }
     };
   }
 
-  private Iterator<Field> storedFieldsIterator() {
-    return new FilterIterator<Field>(fields.iterator()) {
+  private Iterator<StorableField> storedFieldsIterator() {
+    return new FilterIterator<StorableField, Field>(fields.iterator()) {
       @Override
       protected boolean predicateFunction(Field field) {
         return field.type.stored() || field.type.docValueType() != null;
@@ -318,8 +311,8 @@
     };
   }
   
-  private Iterator<Field> indexedFieldsIterator() {
-    return new FilterIterator<Field>(fields.iterator()) {
+  private Iterator<IndexableField> indexedFieldsIterator() {
+    return new FilterIterator<IndexableField, Field>(fields.iterator()) {
       @Override
       protected boolean predicateFunction(Field field) {
         return field.type.indexed();
Index: lucene/core/src/java/org/apache/lucene/index/IndexDocument.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/IndexDocument.java	(révision 1404044)
+++ lucene/core/src/java/org/apache/lucene/index/IndexDocument.java	(copie de travail)
@@ -24,8 +24,8 @@
 public interface IndexDocument {
 
   /** Obtains all indexable fields in document */
-  public Iterable<? extends IndexableField> indexableFields();
+  public Iterable<IndexableField> indexableFields();
   
   /** Obtains all storable fields in document */
-  public Iterable<? extends StorableField> storableFields();
+  public Iterable<StorableField> storableFields();
 }
Index: lucene/core/src/java/org/apache/lucene/util/FilterIterator.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/util/FilterIterator.java	(révision 1404044)
+++ lucene/core/src/java/org/apache/lucene/util/FilterIterator.java	(copie de travail)
@@ -1,8 +1,5 @@
 package org.apache.lucene.util;
 
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements. See the NOTICE file distributed with this
@@ -20,20 +17,23 @@
  * the License.
  */
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 /**
  * An {@link Iterator} implementation that filters elements with a boolean predicate.
  * @see #predicateFunction
  */
-public abstract class FilterIterator<T> implements Iterator<T> {
+public abstract class FilterIterator<T, U extends T> implements Iterator<T> {
   
-  private final Iterator<T> iterator;
+  private final Iterator<U> iterator;
   private T next = null;
   private boolean nextIsSet = false;
   
   /** returns true, if this element should be returned by {@link #next()}. */
-  protected abstract boolean predicateFunction(T object);
+  protected abstract boolean predicateFunction(U object);
   
-  public FilterIterator(Iterator<T> baseIterator) {
+  public FilterIterator(Iterator<U> baseIterator) {
     this.iterator = baseIterator;
   }
   
@@ -60,7 +60,7 @@
   
   private boolean setNext() {
     while (iterator.hasNext()) {
-      final T object = iterator.next();
+      final U object = iterator.next();
       if (predicateFunction(object)) {
         next = object;
         nextIsSet = true;
