2011-06-01 11 views
8

Sonuç genel bir tür olduğunda, Class.forName()'u nasıl ararım? Genellikle asSubclass() kullanabilirim, ancak burada yaptığım tek şey, her şey güzel bir şekilde jenerik ile yazıldığında, & hatalarını bana gönderen bir dökümdür.Typesafe forName sınıf yükleme

bir main() olan bir giriş noktası ana sınıfı ile bir .jar vardır:

senaryo şöyle gider. Bir sınıf isminin (ve diğerlerinin, burada alakasız) bir seçeneği var. Verilen sınıf, Callable<Integer> uygular. Bu sınıf yüklenir, başlatılan & başlatıldı. Bu döküm kurtulmak için herhangi bir yolu

Class<? extends Callable<Integer>> clazz = (Class<? extends Callable<Integer>>) Class.forName(options.valueOf(className)).asSubclass(Callable.class); 

var mı: İşte

ihtiyacım olanı bir örnektir?

SE6'yı kullanma.

cevap

10

Önce muhtemelen classCI nasıl alabilirim tam jenerik Class

Class<Callable<Integer>> classCI = ...; 

Sonra java tipi sistem

Class<? extends Callable<Integer>> clazz =  
    Class.forName(options.valueOf(className)) 
    .asSubclass(classCI); 

bir problemi yok istiyorsun? Biz kontrolsüz döküm

Class<Callable<Integer>> classCI = (Class<Callable<Integer>>)Callable.class; 

Bu doğası gereği güvensiz tarafından hile. className'un gerçekten Callable<Integer> olduğundan emin olmak için harici güçler olmalıdır. Örneğin, Callable<String> ise, program tüm yayınları sorunsuz olarak çalıştırır ve yalnızca Integer call() çağrıldığında çok daha fazla darbeye neden olur ve hata mesajı çok yanıltıcı olur. Bir döküm başarılı statik analiz edilemez eğer Tamam

:

Object o = ...; 
String s1 = (String)o; // may fail, no javac warning 
String s2 = String.class.cast(o); // may fail, no javac warning 

sürece dökme zamanında başarısız olduğunda bir istisna hemen atılır gibi.

çekler emin olmak için uygulanması çünkü proaktif, biz burada "kontrolsüz" bastırmak için haklı className

@SuppressWarning("unchecked") 
Class<? Callable<Integer>> getClass(String className) 
{ 
    Class clazz = Class.forName(className); 
    via reflection, check generic super interfaces of clazz 
    if there's no Callable<Integer> super interface 
     throw "className is not a Callable<Integer>" 

    // we have *checked*, the following cast is safe 
    return (Class<? Callable<Integer>>)clazz; 
} 

jenerik türünü kontrol etmeli, tip güvenli olması için o className Eğer burada Gerçekten Callable<Integer>'u uygulayan bir sınıfı belirtin, hemen burada bir istisna atar. Oyuncumuz "kontrol edildi" ve program güvenli.

+0

+1: omg, Gerçekten jeneriklerle çok uyumlu olmak istiyorum, bu yüzden burada neler olduğunu anlayabiliyorum. – Rekin

+0

Vay, harika cevap. Teşekkürler kabul edildi. :) – TC1

+0

Sadece FYI, cast sınıfı > classCI = (Sınıf >) Callable.class bir nedenden dolayı çalışmıyor. Her neyse, Callable 'u yansıtma yoluyla kontrol ettiğimden, büyük bir anlaşma değil, sadece bunu düzenlemek istediğinizde düşünmeniz gereken bir şey. – TC1

İlgili konular