2011-02-01 19 views
9

Tengo un montón de clases en java que implementan una interfaz llamada IdObject (que especifica un método getId()). Además, también implementan Comparable <> consigo mismos como parámetro de tipo, por lo que son todos comparables a ellos.Java: declarando variables con múltiples "restricciones" genéricas en ellos

Lo que me gustaría hacer es declarar una lista de dichos objetos, completarla, luego ordenarla y llamar a getId() sobre ellos. Así que mi código es el siguiente:

List<? extends IdObject & Comparable<?>> objectList = null; 

if (foo) { 
    objectList = new ArrayList<TypeA>(); 
    ... 
} else if (bar) { 
    objectList = new ArrayList<TypeB>(); 
    ... 
} 

if (objectList != null) { 
    Collections.sort(objectList); 
    for (IdObject o : objectList) { 
     System.out.println(o.getId()); 
    } 
} 

Básicamente mi problema radica en la primera línea - Quiero especificar dos "limitaciones" para el tipo porque necesito el primero para asegurarse de que pueda imprimir el ID de el ciclo y el segundo para asegurarme de que pueda usar Collections.sort() en la lista.

La primera línea no se compila.

¿Hay alguna manera de hacer que esto funcione sin especificar un tipo genérico sin parámetros de tipo y utilizando operaciones no verificadas? Tampoco podría encontrar un ejemplo de esto en Internet.

Saludos

Respuesta

0

¿Qué hay de la creación de antoher tipo;

public CompIdObject extends IdObject implements Comparable { 
... 
} 

y utilizar este tipo para sus genéricos?

List<? extends CompIdObject<?>> objectList = null; 
+2

Advertencia: Su CompIdObject no está declarado como genérico. – Nicolas

11
List<? extends IdObject & Comparable<?>> 

Este tipo de multiple bounded type parameters sólo es posible en las firmas de clase, me temo.

así que supongo que lo más cerca que puede obtener es definir una interfaz:

public interface MyInterface extends IdObject, Comparable<MyInterface> 

Y declarar su lista como esta:

List<? extends MyInterface> objectList = null; 
+1

Es mejor decir 'ComparableIdObject' que' MyInterface'. – Raedwald

+0

@Raedwald obviamente, sí. –

+1

¿De verdad espera que todas las clases que implementan 'MyInterface' sean comparables entre sí? Si no, intente 'interfaz pública MiInterfaz extiende IdObjeto, Comparable >' y 'Lista > objectList' – finnw

0

Yo he querido hacer cosas similares antes en los campos también, pero no se puede hacer (quizás alguien podría explicar si se trata de una restricción técnica o una opción de diseño, no estoy seguro).

El camino a seguir sería diseñar un inter la cara que extiende IdObject y Comparable, luego la usa en su definición de lista genérica.

Cuestiones relacionadas