2011-07-09 75 views
23

这种方法能以某种方式返回true吗?“instanceof Void”是否总是返回false?

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

你怎么称呼这个方法?你能举一些例子吗? –

+3

为什么你甚至想要做这个测试?这一切背后必定有一些故事。 –

+2

@Hovercraft我只是喜欢这些棘手的行为旁边我想知道更多关于“虚空” –

回答

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

+6

+1反思“滥用” –

+2

+1非常好!顺便说一句,你只是使用'c.newInstance()'(不需要'null'参数) – Bohemian

+6

+1防止通过反射创建的唯一类是Class。 –

2

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

顺便说一句:如果你真的想这样做,请通过反射调用Void的构造函数。但我可以把它看作是一个滥用系统的练习。祝你好运。

2

号:

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

我不明白你为什么会检查是否值是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 

可能有其他用途的情况下这种方法,但我没有看到任何其他的现在。