“instanceof Void”总是返回false吗?

时间:2011-07-09 18:41:04

标签: java generics void instanceof

此方法可以某种方式返回true吗?

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

4 个答案:

答案 0 :(得分:51)

是的,但我确信这不是很有用:

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个实例。上面的代码片段只是使用反射时可以释放出来的一个例子...; - )

答案 1 :(得分:6)

我无法理解为什么你会检查一个值是否是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

此方法可能还有其他用例,但我现在没有看到任何其他用例。

答案 2 :(得分:2)

没有。要使其返回true,您必须调用它并传递类型为Void的参数。但类Void的构造函数是私有的,所以你不能调用它。此外,这个类是最终的,所以你甚至无法扩展它。因此,您无法创建类Void的实例。但是需要让你的方法返回true。

BTW:如果你真的想这样做,请通过反射调用Void的构造函数。但我可以将此视为系统滥用行为。祝你好运。

答案 3 :(得分:2)

否:

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