Estoy intentando escribir una clase que tiene una variable de miembro genérica pero que no es, en sí misma, genérica. Específicamente, quiero decir que tengo una Lista de valores de "algún tipo que implementa de forma comparable a sí mismo", por lo que puedo ordenar ordenar en esa lista ... Espero que tenga sentido.Variable de instancia genérica en la clase no genérica
El resultado final de lo que estoy tratando de hacer es crear una clase de modo que pueda crear una instancia de dicha clase con una matriz de (cualquier tipo) y hacer que genere una representación de cadena para esa lista. En el código real, yo también pase en la clase de los tipos que estoy pasando en:
String s = new MyClass(Integer.class, 1,2,3).asString();
assertEquals("1 or 2 or 3", s);
String s = new MyClass(String.class, "c", "b", "a").asString();
assertEquals("\"a\" or \"b\" or \"c\"", s);
principio yo ni siquiera quería pasar en la clase, sólo quería pasar en los valores y tienen el código examina la matriz resultante para elegir la clase de los valores ... pero eso también me daba problemas.
El siguiente es el código que tengo, pero no puedo dar con el mojo correcto para poner para el tipo de variable.
public class MyClass {
// This doesn't work as T isn't defined
final List<T extends Comparable<? super T>> values;
public <T extends Comparable<? super T>> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable<? super T>> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
error en la línea de declaración de variables:
Syntax error on token "extends", , expected
sería muy apreciado Cualquier ayuda.
Edit: código actualizado para usar List en lugar de array, porque no estoy seguro de que se pueda hacer con matrices.
@ Marcos: De todo lo que he leído, lo que realmente quiero decir "T es un tipo que es comparable a sí mismo", no sólo "T es un tipo que es comparable". Dicho esto, el siguiente código no funciona bien:
public class MyClass {
// This doesn't work
final List<? extends Comparable> values;
public <T extends Comparable> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
error en la línea add:
The method add(capture#2-of ? extends Comparable) in the type List<capture#2-of ? extends Comparable> is not applicable for the arguments (T)
error en la línea para ordenar:
Type mismatch: cannot convert from List<capture#4-of ? extends Comparable> to List<T>
Conclusión:
De lo que se trata, parece, es que Java no puede manejar wh en lo que quiero hacer El problema se debe a que lo que estoy tratando de decir es:
Quiero una lista de elementos que son comparables contra sí mismos, y yo crear toda la lista a la vez de los datos pasados en en la creación.
Sin embargo, Java ve que tengo esa lista y no puedo asegurar que toda la información para mi situación esté disponible en tiempo de compilación, ya que podría intentar agregar cosas a la lista más tarde y, por tipo borrado, no puede garantizar esa seguridad. No es posible comunicar a Java las condiciones involucradas en mi situación sin aplicar el tipo genérico a la clase.
¿Por qué no es suficiente tener una Lista de cosas que implementen Comparable? –
No es que resuelva el problema, pero si algo es comparable no significa que sea comparable. La simple implementación de Comparable no dice "es comparable contra sí misma". – RHSeeger
Puede hacerlo con métodos estáticos. Ver mi segunda respuesta. – TofuBeer