java generics void instanceof

java - ¿"Instanceof Void" siempre devuelve falso?



generics (4)

No comprendo por qué verificará si un valor es una instancia de void (o Void ), ya que, como en otras veces, no se puede crear una instancia o incluso extender sin piratear con la reflexión. Sin embargo, para una situación más útil, si desea saber si una Class dada es de un tipo nulo, no usaría instanceof y su parámetro de método sería de tipo Class<?> 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 daría salida

void = true

Puede haber otros casos de uso para este método, pero no veo ningún otro en este momento.

¿Puede este método volverse true alguna manera?

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


No. Para volverlo 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 definitiva, por lo que ni siquiera puedes extenderla. Por lo tanto, no puede crear una instancia de la clase Void . Pero es necesario para que tu método de retorno sea verdadero.

BTW: 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.


No:

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


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); }

Void se puede crear una instancia de una clase Void , por lo que normalmente su código no requeriría lidiar con las instancias Void . El fragmento de código anterior es solo un ejemplo de los estragos que puedes desatar al usar la reflexión ... ;-)