2010-02-16 71 views
5

Java'da tür silme işlemiyle ilgili belgelerin çoğu, kullanım durumunun SomeType<ParamType> gibi bir türü ele aldığını varsayar. Aşağıdaki yöntem için yöntem parametresi işlemeye çalışıyorum: konteyner sınıfı bir tür DvQuantity ile nesnelleştirildiğindeJava: iç içe türetilmiş türetilmiş türlerde (yansıma) iç içe geçme

public void setOtherReferenceRanges(List<ReferenceRange<T>> referenceRanges) 

, bu imza çalışma zamanında public void setOtherReferenceRanges(List<ReferenceRange<DvQuanitity>> referenceRanges) haline gelmelidir.

Yansımayı kullanarak, List'un actualTypeArgument adresinde ReferenceRange<T> olduğunu görebilirsiniz. Yansıma sınıf bilgilerini kullandığı için, bana ReferenceRange<DvQuantity> vermesini beklemezdim. Ancak, bu yöntemi içeren sınıfı oluşturduğumda, DvQuantity türünü T olarak geçtim. Yani, T'da doldurma türü Java çalışma zamanı için kullanılabilir olmalıydı, ancak bunu elde etmenin bir yolunu bulamadım. Ben herhangi bir yararlı veri içermiyor gibi yansıma yoluyla erişilen bir TypeVariableImpl nesnesi ile biter.

Bu bilgileri çalışma zamanında keşfetmenin herhangi bir yolunu düşünebilir misiniz?

cevap

1

ben bu yöntemi

Sana örneğin, bu tür bir nesne oluştururken demek sanırım içeren sınıf oluşturulmuş

derken:

foo = new ContainerClass<DvQuantity>(); 

Bu durumda, silme nedeniyle, DvQuantity türünü kurtarmanın bir yolu yoktur.

Ancak, neredeyse ilk örneği gibi ama ince ile bakar ki (bu

class DvQuantityContainerClass extends ContainerClass<DvQuantity> {...} 
... 
foo = new DvQuantityContainerClass(); 

Veya, daha kısa, bir satır içi anonim alt sınıf gibi, üst sınıfa türü parametresi geçen bir sınıf oluşturursanız ama önemli bir fark): Eğer çalışma zamanında bir üst sınıfı uzatmak için kullanılan türü parametresi kurtarmak çünkü

foo = new ContainerClass<DvQuantity>(){}; 

Sonra, türü parametresi kurtarabilirsiniz. Ne yazık ki, Java kendisi artık doldurulmuş T ile DvQuantityContainerClass.setOtherReferenceRanges yöntemi türünü almak için kolay bir yol sağlamaz Bunun için, genel türler gelişmiş yansıma yapmak, gentyref yazdık.

Method m = DvQuantityContainerClass.class.getMethod("setOtherReferenceRanges", List.class); 
// this will return List<ReferenceRange<DvQuanity>>, like you are lookingn for 
return GenericTypeReflector.getExactParameterTypes(m, DvQuantityContainerClass.class) 
+0

Yanıt için teşekkürler. Şimdiye kadar gördüğüm şeyi doğrular. Ne yazık ki, bu çalışmayı yapmam gereken kurulum üzerinde hiç gücüm yok. Ayrıca, diğer kontroller sayesinde, durum üzerinde kontrol sahibi olsaydım, yararlı olurdu. – mahonya

0

Genel tür bilgileri erased by the compiler olup çalışma zamanında mevcut değildir. Ben sınıf argüman geçmek zamanında belirli bir tür sağlamak için gereken zaman:

public <T> void doSomething(T t, Class<T> c); 

Bu her zaman kullanışlı ve hatta mümkün değildir, ancak birçok durumda mümkün değildir.

0

Dolayısıyla, T türünde yazı doldurma Java çalışma zamanı için kullanılabilir olmalıydı, ancak bunu elde etmenin bir yolunu bulamadım.

Belki de tam olarak doğru değil, ama bunu düşünüyorum yolu zamanında hiçbir gerçek sınıf olmasıdır - Yani T. arayüzünü karşılayan belirli bir türü olmayan sadece bir obje, silme değil olur nesneler ile, ama bunun yerine bu nebulous (OOP dünyasında en azından) tip şeyler.

http://java.sun.com/docs/books/tutorial/java/generics/erasure.html

sınıfın kendi içinde tür bilgileri (T tipi bir yöntem getUnderlyingType (...) ya da bir şey gerekir) yakalama yolları vardır, ama bu kötü bir fikir. Nesnenin ham türüne gerçekten ihtiyacınız varsa, jenerik kullanarak tekrar düşünün.