Может ли этот метод как-то вернуть true
?
public static <T> boolean isVoid(T t)
{
return t instanceof Void;
}
Может ли этот метод как-то вернуть true
?
public static <T> boolean isVoid(T t)
{
return t instanceof Void;
}
Да, но я уверен, что это не очень полезно:
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
. Вышеприведенный фрагмент кода является лишь примером того, какой хаос вы можете вызвать при использовании отражения... ;-)
c.newInstance()
(параметр null
не нужен)
- person Bohemian♦; 09.07.2011
().isInstanceOf[Unit] == true
- person soc; 25.07.2011
Я не понимаю, почему вы должны проверять, является ли значение экземпляром void
(или Void
), поскольку, как было сказано n-й раз, его нельзя создать или даже расширить без взлома с отражением. Однако в более полезной ситуации, если вы хотите знать, имеет ли данный Class
тип void, вы не должны использовать 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
Могут быть и другие варианты использования этого метода, но я не вижу другого прямо сейчас.
Нет. Чтобы он возвращал true, вы должны вызвать его и передать аргумент типа Void
. Но конструктор класса Void является приватным, поэтому вызвать его нельзя. Более того, этот класс является окончательным, поэтому его нельзя даже расширять. Таким образом, вы не можете создать экземпляр класса Void
. Но это необходимо, чтобы ваш метод возвращал true.
Кстати: если вы действительно хотите это сделать, вызовите конструктор Void
путем отражения. Но я могу думать об этом как об упражнении по злоупотреблению системой. Удачи.