2011-07-09 11 views
23

¿Puede este método devolver true de alguna manera?¿"instanceof Void" siempre devuelve falso?

public static <T> boolean isVoid(T t) 
{ 
    return t instanceof Void; 
} 
+1

¿cómo llama a este método? puedes dar algunos ejemplos? –

+3

¿Por qué querrías hacer esta prueba? Debe haber alguna historia detrás de todo esto. –

+2

@Hovercraft Simplemente me gustan estos engañosos comportamientos además de que quiero saber más sobre "Void" –

Respuesta

51

Sí, pero estoy seguro de que no es realmente útil:

public static void main(final String[] args) throws Exception { 
    final Constructor c = Void.class.getDeclaredConstructors()[0]; 
    c.setAccessible(true); 
    System.out.println(c.newInstance(null) instanceof Void); 
} 

Una clase Void no puede ser instanciada por lo que normalmente el código no sería necesario para hacer frente a casos Void. El fragmento de código anterior es solo un ejemplo de los estragos que puede desatar al usar la reflexión ... ;-)

+6

+1 para reflexión "abuso" –

+2

+1 ¡muy agradable! por cierto, solo usas 'c.newInstance()' (no necesitas el parámetro 'null') – Bohemian

+6

+1 La única clase que se impide crear mediante Reflection es Class. –

2

No. Para que sea verdadero, debe llamarlo y pasar un argumento de tipo Void. Pero el constructor de la clase Void es privado, por lo que no puedes llamarlo. Además, esta clase es final, por lo que no puedes extenderla. Por lo tanto, no puede crear una instancia de la clase Void. Pero es necesario para que su método sea verdadero.

BTW: si realmente desea hacerlo, llame al constructor de Void por reflexión. Pero puedo pensar en esto como un ejercicio de abuso del sistema. Buena suerte.

2

No:

Constructor<Void> cv = Void.class.getDeclaredConstructor(); 
cv.setAccessible(true); 
Void v = cv.newInstance(); 
System.out.println(v instanceof Void); //-> true 
6

no veo por qué se comprueba si un valor es una instancia de void (o Void) ya que, como dijo que los tiempos nª, no pueden ser instanciado, o incluso ampliar sin cortar con reflexión. Sin embargo, para una situación más útil, si desea saber si un Class dado es de un tipo nulo, no usaría instanceof y su parámetro de método sería del tipo Class<?> en su lugar. Un caso de prueba sería:

public class VoidCheckTest { 

    public static void main(String...args) throws SecurityException, NoSuchMethodException { 
     Class<VoidCheckTest> c = VoidCheckTest.class; 

     Method m = c.getMethod("main", String[].class); 

     System.out.println(m.getReturnType().getName() + " = " + isVoid(m.getReturnType()));   
    } 

    private static boolean isVoid(Class<?> t) { 
     return Void.class.isAssignableFrom(t) || void.class.equals(t); 
    } 
} 

la que habría de salida

void = true 

Es posible que otros casos de uso de este método, pero aún no hay otra en este momento.

Cuestiones relacionadas