2011-02-04 18 views
10

He la siguiente clase genérica:genéricos de Java error de compilación

public class GenericClass<E,T extends Comparable<T>> 
{ 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create() 
    { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() 
    { 
    } 
} 

Y así es como simplemente lo uso:

GenericClass<MyClass, Double> set = GenericClass.create(); 

Eclipse compilación no muestra ningún error, sin embargo - la construcción con la hormiga ofrece el siguiente error:

MyClass.java:19: incompatible types; no instance(s) of type variable(s) E,T exist so that GenericClass<E,T> conforms to GenericClass<MyClass,java.lang.Double> 
[javac] found : <E,T>GenericClass<E,T> 
[javac] required: GenericClass<MyClass,java.lang.Double> 
[javac]    GenericClass<MyClass, Double> set = GenericClass.create(); 

Gracias!

+0

Y SortedSetByDoubleValue es ...? –

+0

Solucionado ... Cambié los nombres de las clases por simplicidad – duduamar

+0

Mi sugerencia es no utilizar los mismos nombres para los tipos genéricos en el método estático create y la clase. Aunque es técnicamente legal, podría llevar a cometer algunos errores locos. Sugeriría encarecidamente reemplazar E, T con E2 y T2 (o lo que sea) en toda la definición de create(). –

Respuesta

8

Trate de usar esto:

 GenericClass<String, Double> set = GenericClass.<String,Double>create(); 

El Eclipse compilador javac y difieren en su tolerancia.

+1

Entonces, ¿cómo funciona Google Sets.newHashSet() (por ejemplo)? ¿Cuál es la diferencia? – duduamar

+0

@duduamar: 'newHashSet()' es menos complejo: no tiene restricciones en los dos argumentos de tipo. –

+0

Genial ... aprendí algo nuevo. Gracias a todos – duduamar

0

Su expresión GenericClass.create() no muestra ninguna indicación de tipo, por lo que el compilador no puede inferir el tipo real de E y T. Necesita cambiar el prototipo de su función para ayudar al compilador.

La forma más sencilla es pasar las clases.

Ejemplo:

public class GenericClass<E,T extends Comparable<T>> { 
    public static <E, T extends Comparable<T>> GenericClass<E, T> create(Class<E> e, Class<T> t) { 
     return new GenericClass<E, T>(); 
    } 

    private GenericClass() { 
    } 
} 

GenericClass<MyClass, Double> set = GenericClass.create(MyClass.class, Double.class); 
+0

El compilador * debería * ser capaz de inferir el tipo. Y es posible (como lo demuestra claramente el compilador de eclipses). He encontrado errores similares donde 'javac' no pudo inferir los tipos y el compilador de eclipse fue capaz de hacerlo. Cada vez que he archivado errores (tanto con Eclipse como con Sun/Oracle) resultó ser 'javac' el culpable. –

+0

Sí ... pero javac es la referencia ;-) De todos modos, aprendí algo nuevo gracias a Grzegorz. – cadrian