Java local class and generics, why a compiler warning?

Named local classes are very rarely used, usually local classes are anonymous. Does anyone know why the code below generates a compiler warning?

public class Stuff<E> {
  Iterator<E> foo() {
    class InIterator implements Iterator<E> {
      @Override public boolean hasNext() { return false; }
      @Override public E next() { return null; }
      @Override public void remove() { }
    }
    return new InIterator();
  }
}

Warning is in new InIterator()and he says

[unchecked] unchecked conversion
found   : InIterator
required: java.util.Iterator<E>

If the class, immutable, is made anonymous, or if it is made a member, the warning disappears. However, as a named local class, a declaration is required to declare a warning class InIterator<E> implements ....

What's happening?

+5
source share
4 answers

, javac. , InIterator, E, , , - , , E - Stuff E.

( Jorn ):

public class Stuff<E> {
  E bar;
  Iterator<E> foo() {
    class InIterator<Z> implements Iterator<E> {
      @Override public boolean hasNext() { return false; }
      @Override public E next() { return bar;  }
      @Override public void remove() { }
    }
    return new InIterator<Void>();
  }
}

.

+1

, generic type, InIterator ( ).

: , 100% InIterator Iterator<E>, . ( , . Eclipse, , Eclipse , JDK.)

, , , , , , :

public class Stuff<E> {
  Iterator<E> foo() {
    class InIterator<F> implements Iterator<F> {
      @Override public boolean hasNext() { return false; }
      @Override public E next() { return null; }
      @Override public void remove() { }
    }
    return new InIterator<E>();
  }
}
+3

, .

import java.util.Iterator;

public class Stuff<E> {
    Iterator<E> foo() {
        class InIterator implements Iterator<E> {
            public boolean hasNext() {
                return false;
            }

            public E next() {
                return null;
            }

            public void remove() {
            }
        }
        return new InIterator();
    }

    public static void main(String[] args) {
        Iterator<String> i = new Stuff<String>().foo();
    }
}
+1

, , . "" -, . , .

public class Stuff<E> {
  class InIterator implements Iterator<E> {
    @Override public boolean hasNext() { return false; }
    @Override public E next() { return null; }
    @Override public void remove() { }
  }
  Iterator<E> foo() {
    return new InIterator();
  }
}
+1
source

All Articles