Type erasure का अर्थ है कि ऑब्जेक्ट सामान्य प्रकार के बारे में जानकारी निष्पादन समय पर मौजूद नहीं है।
(लिंक एंजेलिका लैंगर के Java Generics FAQ के प्रासंगिक अनुभाग जो लगभग हर सवाल आप संभवतः जावा जेनरिक :)
हालांकि के बारे में पूछ सकते हैं, तो आप वास्तव में एक वस्तु के प्रकार में कोई दिलचस्पी नहीं कर रहे हैं उत्तर देना चाहिए करने के लिए है - आप फ़ील्ड के प्रकार में रूचि रखते हैं। मैंने सवाल को गलत तरीके से पढ़ा है, और हालांकि जवाब स्वीकार कर लिया गया है, मुझे उम्मीद है कि इसे अब ठीक करके संशोधित करना होगा :)
यदि फ़ील्ड एक प्रकार पैरामीटर का उपयोग नहीं करता है, तो यह किया जा सकता है। उदाहरण के लिए:
import java.lang.reflect.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
Field field = Test.class.getDeclaredField("names");
ParameterizedType type = (ParameterizedType) field.getGenericType();
// List
System.out.println(type.getRawType());
// Just String in this case
for (Type typeArgument : type.getActualTypeArguments())
{
System.out.println(" " + typeArgument);
}
}
}
तो क्षेत्र क्षेत्र में किया जा रहा List<T>
के साथ एक कक्षा T
में थे तो आप संग्रह के लिए प्रकार तर्क पता करने के लिए में उदाहरण के लिए प्रकार तर्क पता करने के लिए होगा।
इसे अपने आवश्यक कोड में अनुवाद करना कुछ हद तक मुश्किल है - आपको संग्रह वर्ग के बिंदु पर टाइप तर्क को वास्तव में जानने की आवश्यकता है। उदाहरण के लिए, अगर किसी ने घोषणा की:
public class StringCollection implements Collection<String>
और फिर प्रकार StringCollection
के एक क्षेत्र, उस क्षेत्र में ही किसी भी प्रकार के तर्क नहीं होता था। इसके बाद आपको getGenericSuperType
और getGenericInterfaces
को तब तक जांचना होगा जब तक आप जो चाहते थे उसे प्राप्त न करें।
यह वास्तव में ऐसा करना आसान नहीं होगा, भले ही यह संभव हो। अगर मैं आप थे तो मैं आपके डिजाइन को बदलने की कोशिश करता हूं ताकि आपको इसकी आवश्यकता न हो।
स्रोत
2009-07-14 20:46:57
मुझे इसी तरह की समस्या का सामना करना पड़ रहा था और अंत में यह मेरे लिए हल हो गया: http://stackoverflow.com/a/183232/639119 – Zds