2010-01-17 10 views
34

Antes que nada, solo conozco los conceptos básicos de Java. Ahora tengo el siguiente escenario:¿Cómo establecer restricciones en tipos genéricos en Java?

que tienen una clase genérica:

public class ListObject<T> 
{ 
    // fields 
    protected T _Value = null; 
     // .. 
} 

Ahora quiero hacer algo como lo siguiente:

ListObject<MyClass> foo = new ListObject<MyClass>(); 
ListObject<MyClass> foo2 = new ListObject<MyClass>(); 
foo.compareTo(foo2); 

El problema es, ¿cómo puedo definir la .compareTo() Método mientras que T es genérico? Supongo que de alguna manera debo implementar una restricción en el T genérico para decir que T implementa una interfaz específica (tal vez Comparable, si esa existe).

¿Alguien me puede proporcionar una pequeña muestra de código?

Respuesta

41

Lea también la discusión aquí: Generics and sorting in Java

respuesta corta, lo mejor que se puede obtener es:

class ListObject<T extends Comparable<? super T>> { 
    ... 
} 

Pero también hay razón para utilizar simplemente:

class ListObject<T extends Comparable> { 
    ... 
} 
+1

Me quedaré con ListObject por el momento. – citronas

+3

También compruebe el hilo relacionado: http://stackoverflow.com/questions/2064169/what-does-this-class-declaration-mean-in-java/2072820, que analiza la necesidad de comodín de la forma: sateesh

2

Probar public class ListObject<T extends U>. Solo T s que implementan U (o derivan de U) serán sustituciones permitidas.

+0

me da un error de compilación. Incluso con un simple TestClass tales: clase pública ConstraintTest {} Error de sintaxis en el token "instrumentos" ,, espera alcanzar ¿Qué me falta? – citronas

+0

@citronas: en realidad se 'extiende' incluso para las interfaces. Tenga en cuenta que si usa una clase base con el atributo 'extends', puede agregar la clase base directamente al objeto generificado, ese es el mayor * efecto secundario (y peor) * de la extensión de genéricos. – Esko

+0

Whoops. Mi mal, gracias por la captura, @Esko. –

-2
public class ListObject<T implements Comparable> {...} 
+4

-1 Voted down porque Comparable sin el parámetro type es un tipo raw que no deberías usar con Java 1.5+ – helpermethod

+2

esto no es sintaxis válida – newacct

4

Esto depende exactamente de lo que quiere que el método compareTo lo haga. Basta con definir el método compareTo tomar otras ListObject<T> valores se realiza mediante el siguiente

public class ListObject<T> { 
    public int compareTo(ListObject<T> other) { 
    ... 
    } 
} 

Sin embargo, si desea llamar a métodos en realidad ese parámetro tendrá que añadir algunas limitaciones para dar más información sobre el valor T como por lo

class ListObject<T extends Comparable<T>> { 
    ... 
} 
Cuestiones relacionadas