Ö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.
+1: omg, Gerçekten jeneriklerle çok uyumlu olmak istiyorum, bu yüzden burada neler olduğunu anlayabiliyorum. – Rekin
Vay, harika cevap. Teşekkürler kabul edildi. :) – TC1
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