Pregunta

EDITAR: Esto resultó no ser un problema con el código en absoluto, sino con un error en el complemento Groovy Eclipse ( http://jira.codehaus.org/browse/GRECLIPSE-373 )

Eclipse me está dando un extraño mensaje de error sobre tipos ambiguos en Java programa y realmente no entiendo por qué. Tengo una interfaz que toma un parámetro genérico que indica qué tipo de datos devuelve.

public interface InterfaceA<T> {
    T getData();
}

Una de sus implementaciones se ve así:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
       // get the data
    }
}

También hay un contenedor para una interfaz A

public class Container<T extends InterfaceA>
{
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }
}

Hacer esto provoca que " getData sea ambiguo " error.

Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
Collection<AnotherClass> coll = c.getA().getData();

Estoy perplejo con este.

¿Fue útil?

Solución

Parece que hay un error que causa esto desde el complemento maravilloso. http://jira.codehaus.org/browse/GRECLIPSE-373 . No es un problema de Java en absoluto. Gracias por la ayuda y mis disculpas.

Otros consejos

Collection<T> getData() definido en Impl debe hacerse público . Si hago esto, el código se compila limpiamente para mí.

Como han dicho otros carteles, no veo este problema en Eclipse 3.5.0 que se ejecuta en JDK 1.6.0.14 (al corregir la visibilidad reducida del método getData()).

Sugiero hacer una compilación limpia (Proyecto / Limpiar en Eclipse). Además, la versión de Eclipse y Java que está ejecutando podría ayudar.

- Flaviu Cipcigan

Su ejemplo editado funciona bien para mí (JDK 1.5) con la excepción de que debe definir el tipo genérico en el constructor. Aquí está mi código de trabajo completo:

public interface InterfaceA<T> {
    T getData();
}

public static class Impl<T extends Date> implements InterfaceA<Collection<T>> {
    public Collection<T> getData() {
        return null;
    }
}

public static class Container<T extends InterfaceA> {
    private T a;

    public Container(T a) {
        this.a = a;
    }

    public T getA() {
        return a;
    }

}

public static void main(String[] args) {
    Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());
    Collection<Date> coll = c.getA().getData();
}

[Editar para reflejar la pregunta actualizada]

Esto ni siquiera debería compilarse ya que está reduciendo la visibilidad del método del ámbito público al paquete:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> {
    Collection<T> getData() {
       // get the data
    }
}

Y esto todavía se compila para mí (Eclispe 3.4, OS X, 1.5), así que no sé cuál es exactamente el problema:

paquete temp.tests;

import java.util.Collection;

public interface InterfaceA <T> {

    T getData();

    public static final class AnotherClass {}

    public static final class Impl<T extends AnotherClass> 
             implements InterfaceA<Collection<T>>
   {
        public Collection<T> getData () {
            return null;
        }
    }

    public static class Container<T extends InterfaceA>
    {
        private T a;
        public Container(T a) { this.a = a; }
        public T getA() { return a; }
    }

    public static final class Test {
        public static void main (String[] args) {
            Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
            Collection<AnotherClass> coll = c.getA().getData();
        }
    }
}

Lo que tienes aquí parece legítimo. Quizás Eclipse está mostrando un error que de lo contrario no debería.

Vaya a Windows > Preferencias & Gt; Java & Gt; Compilador & Gt; Errores / Advertencias. En el & Quot; Tipos genéricos & Quot; sección, asegúrese de que Eclipse no informa un error para ninguna de las operaciones enumeradas (a menos que también lo desee). Tengo todos los míos en esa sección configurados en & Quot; Advertencia & Quot ;. Luego intentaría actualizar el proyecto y reiniciar Eclipse.

Editar: Después de que se realizó la publicación actualizada, recibí una advertencia (no un error todavía) en las líneas de uso, diciendo & "; El contenedor es un tipo sin formato. Las referencias al contenedor de tipo genérico deben parametrizarse: & Quot ;. Esto se puede solucionar mediante:

Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>());

(En mi ejemplo, estoy usando java.util.Date como en lugar de 'AnotherClass').

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top