2012-09-21 10 views
6

Digamos que tengo una interfaz en Java:clase de interfaz de la aplicación debe ser capaz de agregar sólo un objeto de la misma clase

interface I { 
    void add(I foo); 
} 

, y también dos clases C y D que implementan esta interfaz.

¿Hay alguna manera de modificar la interfaz tal que sólo podía hacer:

C c = new C(); 
c.add(new C()); 

, pero no

c.add(new D()); 

?

que tenía esta pregunta en un examen, pero mi única idea era utilizar el instanceof operador en la definición del método:

class C implements I { 
    public void add(I foo) { 
     if (foo instanceof C) { 
      System.out.println("instance of C"); 
     } else { 
      System.out.println("another instance"); 
     } 
    } 
} 

Sin embargo, no sé cómo modificar la interfaz de modo que produzco el mismo efecto.

Gracias

Respuesta

7

Sí - que necesitan los genéricos:

interface I <T extends I<T>> { 
    void add(T foo); 
} 

para definir una clase de usarlo, el código de esta manera:

class C implements I<C> { 
    @Override 
    public void add(C foo) { 
     // 
    } 
} 

Tenga en cuenta que no hay manera de prevenir el implementador de la codificación de esto (suponiendo D también implementa I):

class C implements I<D> { 
    @Override 
    public void add(D foo) { 
     // 
    } 
} 

Sin embargo, esto sólo sería un problema si el codificador de la clase C sabía de la existencia de la clase D y optó por utilizar, lo cual es poco probable si se centran en la clase C codificación.

Incluso teniendo en cuenta esta advertencia, si estuviera estableciendo esta pregunta de examen, esperaría que lo anterior fuera la respuesta.

+1

Este método no es infalible. Por ejemplo, todavía puedes hacer algo como 'clase D implementa I '. Sin embargo, es un indicador muy fuerte de intención, y un desarrollador que viola lo anterior merece todo lo que obtiene. – Dunes

+2

Para evitar advertencias sobre el tipo no parametrizado, la declaración debe ser 'interface I >'. –

+0

@Bohemian ¡Gracias! – Claudiu

Cuestiones relacionadas