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

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

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

person Eng.Fouad    schedule 09.07.2011    source источник
comment
как вы называете этот метод? можете привести несколько примеров?   -  person Yanick Rochon    schedule 09.07.2011
comment
Зачем тебе вообще этот тест? За всем этим должна быть какая-то история.   -  person Hovercraft Full Of Eels    schedule 09.07.2011
comment
@Hovercraft Мне просто нравится это хитрое поведение, кроме того, я хочу узнать больше о Void   -  person Eng.Fouad    schedule 09.07.2011
comment
+1 за нелепость   -  person Mark Elliot    schedule 09.07.2011


Ответы (3)


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

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

person Sanjay T. Sharma    schedule 09.07.2011
comment
+1 очень красиво! Кстати, вы просто используете c.newInstance() (параметр null не нужен) - person Bohemian♦; 09.07.2011
comment
+1 Единственный класс, которому запрещено создавать с помощью отражения, — это класс. - person Peter Lawrey; 09.07.2011
comment
Вот почему, если вы хотите убедиться, что никто никогда не создает экземпляр класса (например, библиотеки), вам нужно не только сделать конструктор закрытым, но и заставить этот конструктор вызывать исключение. Я бы рекомендовал UnsupportedOperationException. - person Sled; 25.07.2011
comment
@ Санжари Т. Шарма А, QFT.equals (Цитируется за правду)? - person Sled; 25.07.2011
comment
Эквивалентный код работает, не требуя ничего сложного в Scala: ().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

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

person Yanick Rochon    schedule 09.07.2011

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

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

person AlexR    schedule 09.07.2011