2011-02-06 15 views
13

Mi código no se puede convertir de E a E. Puedo hacer un molde para escribir E, pero parece redundante en esta etapa. Mi array ya está declarado como E-type. Genéricos de Java, no se puede convertir de E a E

import java.util.Iterator; 

public class DataTypeDemo<E> 
{ 
private E[] data = (E[]) new Object [10]; 

public MyIterator newIterator() 
{ 
    return new MyIterator(); 
} 

private class MyIterator<E> implements Iterator<E> 
{ 
    private int location; 

    public boolean hasNext() 
    { 
     return location < data.length; 
    } 

    public E next() 
    { 
     return (data[location++]); // error here 
    } 

    public void remove() 
    { 
     throw new UnsupportedOperationException(); 
    } 
} 
} 

compilador, lanza este error:

DataTypeDemo.java:23: tipos incompatibles encontrado: E requerido: E

+1

Por favor, publique un ejemplo completo que permita a otro reproducir su error. De lo contrario, es poco probable que obtenga ayuda. Por cierto, ¿verificaste que no tienes dos clases llamadas "E" (en diferentes paquetes)? – sleske

+0

¿Alguna razón por la que no está utilizando una 'Lista '? Arrays y genéricos realmente no juegan muy bien juntos. –

+0

@sleske: 'E' es un parámetro de tipo en la clase. No hay una clase real llamada 'E' en este caso. –

Respuesta

19

Su tipo interno presenta su propia variable de tipo:

private class MyIterator<E /* this is the problem*/> implements Iterator<E> 

Y por lo tanto, sobrescribe la clase externa tipo de variable

Cambiar su declaración de tipo a esto:

private class MyIterator implements Iterator<E> 

Referencia:

  • Generics FAQ (aunque este problema no se menciona literalmente, se da a entender por esta FAQ)
5

La raíz de su problema es que un interno clase tuyo. Para el compilador, no hay garantías de que las dos E sean del mismo tipo.

import java.util.Iterator; 
import java.util.ArrayList; 


    public class DataTypeDemo<E> 
    { 
     private ArrayList<E> data = new ArrayList<E>(10); 

     private class MyIterator implements Iterator<E> 
     { 
      private int location; 

      public boolean hasNext() 
      { 
       return location < data.size(); 
      } 

      public E next() 
      { 
       return data.get(location++); 
      } 

      public void remove() 
      { 
       throw new UnsupportedOperationException(); 
      } 
     } 
    } 

Aunque una vez que son conscientes del problema, no dude en implementar su propia solución;)
feliz piratería.

5

Eso es porque le ha dado a la clase interna MyIterator su propio tipo de parámetro E. Tenga en cuenta que E es un parámetro de tipo diferente al E de la clase adjunta (los ha llamado ambos E, pero son dos parámetros de tipo diferente).

Acaba de salir fuera del parámetro de tipo para la clase interna:

private class MyIterator implements Iterator<E> { 
4

creo que el problema es que el tipo de iterador anidada se define como una clase genérica también parametrizado más de un tipo relacionado llamado E. Para solucionar esto, cambiar

private class MyIterator<E> implements Iterator<E> 

Para

private class MyIterator implements Iterator<E> 

esta primera declaración dice que el iterador para su tipo se puede parametrizar sobre cualquier tipo, no solo sobre el tipo del contenedor externo. También introduce una nueva variable de tipo llamada E que está separada de la E en la declaración externa. Esta segunda definición dice que para cualquier tipo de contenedor, hay un tipo de iterador que no es genérico con respecto al tipo externo. Esto es probablemente lo que pretendías.

Cuestiones relacionadas