Всегда ли instanceof Void возвращает false?
Может ли этот метод вернуть true
каким-то образом?
public static <T> boolean isVoid(T t)
{
return t instanceof Void;
}
4 ответа
Да, но я уверен, что это не очень полезно:
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
класс не может быть создан, поэтому обычно ваш код не требует обработки Void
экземпляров. Приведенный выше фрагмент кода является лишь примером того, какой хаос вы можете испытать при использовании отражения...;-)
Я не понимаю, почему вы будете проверять, является ли значение экземпляром void
(или же Void
) поскольку, как сказано n-й раз, не может быть воплощено или даже расширено без взлома с отражением. Тем не менее, для более полезной ситуации, если вы хотите знать, если данный Class
является пустым типом, вы не будете использовать instanceof
и ваш параметр метода будет иметь тип Class<?>
вместо. Тестовый пример будет:
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);
}
}
который бы вывел
void = true
Для этого метода могут быть и другие варианты использования, но сейчас я не вижу других.
Нет:
Constructor<Void> cv = Void.class.getDeclaredConstructor();
cv.setAccessible(true);
Void v = cv.newInstance();
System.out.println(v instanceof Void); //-> true
Нет. Чтобы вернуть это значение true, вы должны вызвать его и передать аргумент типа Void
, Но конструктор класса Void является закрытым, поэтому его нельзя вызвать. Более того, этот класс является окончательным, поэтому вы даже не можете его расширить. Таким образом, вы не можете создать экземпляр класса Void
, Но это необходимо, чтобы ваш метод вернул true.
Кстати: если вы действительно хотите это сделать, вызовите конструктор Void
отражением Но я могу думать об этом как о упражнении в злоупотреблении системой. Удачи.