¿"instanceof Void" siempre devuelve false?


¿Puede este método devolver true de alguna manera?

public static <T> boolean isVoid(T t)
{
    return t instanceof Void;
}
Author: Eng.Fouad, 2011-07-09

4 answers

Sí, pero estoy seguro de que eso 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 su código no requeriría tratar con instancias Void. El fragmento de código anterior es solo un ejemplo de los estragos que puedes desatar cuando usas reflection... ;-)

 51
Author: Sanjay T. Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 19:36:16

No veo por qué debería comprobar si un valor es una instancia de void (o Void) ya que, como se ha dicho enésima vez, no puede ser instanciado, o incluso extendido sin hackear con reflexion. Sin embargo, para una situación más útil, si desea saber si un Class dado es de tipo void, no usaría instanceof y su parámetro de método sería de 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);
    }
}

Que produciría

void = true

Puede haber otros casos de uso para este método, pero yo no ve a cualquier otro ahora mismo.

 6
Author: Yanick Rochon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-09 19:06:41

No:

Constructor<Void> cv = Void.class.getDeclaredConstructor(); 
cv.setAccessible(true); 
Void v = cv.newInstance(); 
System.out.println(v instanceof Void); //-> true
 2
Author: emboss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-09 18:50:33

No. Para que devuelva true tienes que llamarlo y pasar un argumento de tipo Void. Pero el constructor de class Void es privado, así que no puedes llamarlo. Además, esta clase es final, por lo que ni siquiera se puede extender. Por lo tanto, no puede crear una instancia de la clase Void. Pero es necesario hacer que su método para volver verdadero.

Por cierto: Si realmente quieres hacerlo, llama al constructor de Void por reflexión. Pero puedo pensar en esto como un ejercicio de abuso del sistema. Buena suerte.

 2
Author: AlexR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 19:37:53