Всегда ли "instanceof Void" возвращает false?

Может ли этот метод вернуть true как-то?

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

Ответ 1

Да, но я уверен, что это не очень полезно:

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. Вышеприведенный фрагмент кода - это всего лишь пример того, какой хаос вы можете развязать при использовании отражения...; -)

Ответ 2

Я не понимаю, почему вы должны проверить, является ли значение экземпляром 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

Для этого метода могут быть другие варианты использования, но сейчас я не вижу других.

Ответ 3

Нет. Чтобы вернуть значение true, вы должны вызвать его и передать аргумент типа Void. Но конструктор класса Void является закрытым, поэтому вы не можете его назвать. Более того, этот класс является окончательным, поэтому вы даже не можете его расширять. Таким образом, вы не можете создать экземпляр класса Void. Но нужно, чтобы ваш метод возвращался true.

BTW: Если вы действительно этого хотите, вызовите конструктор Void путем отражения. Но я могу думать об этом как о злоупотреблении системой. Удачи.

Ответ 4

Нет:

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