2011-07-09 29 views
23

Bu yöntem bir şekilde true döndürüyor mu?"Instanceof Void" her zaman false döndürüyor mu?

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

Bu yönteme nasıl çağrı yaparsınız? bazı örnekler verebilir misin? –

+3

Bu testi neden yapmak istiyorsun? Tüm bunların arkasında bir hikaye olmalı. –

+2

@Hovercraft Ben sadece yanıltıcı behavoirs gibi Ben daha fazla bilmek istiyorum "Void" hakkında –

cevap

51

Evet ama bu gerçekten yararlı değildir eminim:

A Void sınıfı böylece normalde kod Void vakalarına karşı gerek olmaz başlatılamaz
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); 
} 

. Yukarıdaki kod parçacığı, yansımayı kullanırken açığa vurabileceğiniz bir örneğidir ... ;-)

+6

+1 yansıma "kötüye kullanım" –

+2

+1 çok güzel! btw, sadece 'c.newInstance' ('null 'parametresine gerek yok) kullanın. – Bohemian

+6

+1 Reflection ile oluşturulmasını engelleyen tek sınıf Class'tır. –

2

Hayır. Bunun doğru olması için onu çağırmanız ve Void türünde bir argüman iletmeniz gerekir. Fakat sınıf Void kurucusu özeldir, bu yüzden onu arayamazsınız. Dahası, bu ders finaldir, bu yüzden onu genişletemezsiniz. Böylece, Void sınıfının bir örneğini oluşturamazsınız. Ancak, yönteminizin gerçeğe dönüşmesini sağlamak için gereklidir.

BTW: Bunu gerçekten yapmak istiyorsanız, yansımayla Void yapıcısını arayın. Fakat bunu sistem kötüye kullanımı olarak düşünebilirim. İyi şanslar.

2

No: bir değer gibi n'inci kez instanciated, hatta ile hack olmadan uzatılamaz söyledi beri void (veya Void) bir örneği olduğunu olmadığını kontrol neden

Ben başarısız
Constructor<Void> cv = Void.class.getDeclaredConstructor(); 
cv.setAccessible(true); 
Void v = cv.newInstance(); 
System.out.println(v instanceof Void); //-> true 
6

görmek yansıma. Ancak, daha kullanışlı bir durum için, belirli bir Class boşluğun geçersiz olup olmadığını öğrenmek istiyorsanız, instanceof kullanmazsınız ve yöntem parametreniz bunun yerine Class<?> türünde olur. Bir test durumu şöyle olacaktır:

void = true 

diğer kullanım durumları bu yöntem için, ama şu an başka yoktur görmüyorum olabilir çıktı olurdu

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); 
    } 
} 

.

İlgili konular