2016-04-03 22 views
1

Genel bir yöntemim var, T sınıfını nasıl alabilirim?Genel yöntemlerde genel örnek sınıf örnekleri nasıl alınır

class MyClass 
{ 
    static <T> void foo(T t) 
    { 
     // how to get T.class 
    } 
} 

t.getClass() en türetilmiş sınıf alır, ama Sınıfım durumunda çalışmaz böylece T süper sınıf olabilir. <Koleksiyon> foo (yeni ArrayList()).

+4

diyoruz. Tür silme hakkında bilgi edinin. Yapabileceğiniz en iyi yöntem, yönteme başka bir " clazz" parametresi eklemektir. Bu durumda derleme zamanında –

+0

'T'' '' '' 'object.class' hile yapar. Aksi takdirde, nasıl 't.getClass()'? Not; kimsenin bunun silme ile ilgili bir şey olduğunu söylemesine izin verme; T için herhangi bir sınır tanımlamadınız. –

+0

'T'' _weak_ tipidir, ancak' getClass() '' '_strong_ türünün sınıfını döndürür. [Bu soruya bakın] (http://stackoverflow.com/questions/106336/how-do-i-find-out-what-type-each-object-is-in-a-arraylistobject) –

cevap

2

İmzanızı korumak istiyorsanız, bu mümkün değildir. Ancak, türü ayrı bir argüman olarak sunarak bunu çözmenin bir yolu vardır.

static <T> void foo(T t, Class<T> cls) { 
    // use cls 
} 
Sonra

yerine

MyClass.<Collection> foo(new ArrayList()); 

çağırmanın sen İmkansız

MyClass.foo(new ArrayList(), Collection.class); 
+0

Ben C++ den geliyorum, generiği çok fazla türden çıkarmak için kullanıyoruz. Ne yazık ki, Java'da mümkün değil. –

İlgili konular