2012-08-22 34 views
7

¿Hay alguna manera de referirse a cualquier clase interna?Referencia de clase para una clase interna Java

Me gustaría especificar un tipo de devolución compatible con una clase interna, p.

Class<OuterClass.*> some_method(); 

Entiendo que la sintaxis no es válida. ¿Hay alguna manera de expresar esto?

Sé que no puedo usar algo como Class<? extends OuterClass> porque una clase interna no extiende una clase externa.

+2

¿Por qué quieres hacer eso? No agregaría ningún tipo de seguridad. – SLaks

+1

Sí, puedes crear una clase interna que extienda una clase externa, ¿no? – sp00m

+0

La clase interna es solo una cuestión de dónde se define. También podría pedir una forma de vincular un tipo a un paquete. – Bohemian

Respuesta

5

Bueno, puede hacer referencia a las clases internas específicas, al menos:

<T extends OuterClass.InnerClass> Class<T> some_method() 

Además de eso, ¿qué ganar al devolver un objeto de cualquier clase interna? Eso sería comparable a devolver cualquier objeto más el hecho de que la instancia interna tiene una relación especial con la instancia externa. Sin embargo, probablemente no puedas usar directamente esa relación especial de todos modos.

Editar:

Como otros señalaron que ya InnerClass podría ser una superclase extendido por otras clases internas. Esto le permitiría devolver cualquier clase, que amplía esa clase.

Si utiliza una interfaz, no está restringido a clases internas solamente, ya que para esta restricción necesitaría interfaces internas no estáticas. Sin embargo, las interfaces internas son estáticas por defecto.

+0

Creo que las clases internas estáticas están disponibles solo –

+1

@EugenMartynov no, también puedes usar clases internas no estáticas. – Thomas

+0

+1 Buen punto, gracias. – jldupont

0

No, no hay. Así como no se puede hacer referencia a paquetes con comodines:

Class<com.example.*> some_method(); 
Class<com.example.?> some_method(); 

Los casos de uso para tales declaraciones sería tan limitada, sólo que no lo haría en el JLS. Tenga en cuenta que tampoco puede usar esos "tipos de concordancia de ubicación" fuera del alcance de los genéricos. P.ej. No se puede declarar:

void some_method(OuterClass.* argument); 
void some_method(com.example.* argument); 
3

yo prefiero definir una interfaz (interna), que todos clase interna ponerla en práctica, y luego:

Class<OuterClass.MyInterface> someMethod(); 

Esto sería más tipo de seguro que tratar de hacer referencia a cualquier clase interna Y no tendrías ningún problema el día que necesites otra clase interna para otro uso, o el día que decidas extraer una clase.

+0

+1 buena opción, gracias! – jldupont

+0

Desafortunadamente, las interfaces internas no son compatibles. Tendría que ser una clase base interna. – Thomas

+0

@Thomas ¿qué quiere decir con "interfaces internas no son compatibles"? Se usan comúnmente y son muy útiles para definir devoluciones de llamadas. –

0

Puede definir la interfaz de marcador e Implementarla por clase interna.

<T implements CustomMarkerInterface> Class<T> some_method() 

lo que esta sería aplicable a todas las clases internas de OuterClass

public class Outer { 

    public class Inner implements CustomMarkerInterface{ 

    } 

    public class Inner1 implements CustomMarkerInterface{ 

    } 

    public class Inner2 implements CustomMarkerInterface{ 

    } 

} 
0

Class<InnerClass> está permitido en java. ¿Estás buscando algo específico?

public class Client 
{ 
interface InnerType 
{ 
} 
public class InnerClass implements InnerType 
{ 
} 
public Class<? extends Client.InnerType> test() 
{ 
    return InnerClass.class; 
} 

} 
Cuestiones relacionadas