यह एक प्रश्न के रूप में आया था जो मैंने हाल ही में एक साक्षात्कार में पूछा था कि कुछ उम्मीदवार जावा भाषा में जोड़ा देखना चाहते थे। यह आमतौर पर एक दर्द के रूप में पहचाना जाता है कि जावा में जेनेरिकों का पुनरीक्षण नहीं किया गया है , लेकिन जब धक्का दिया जाता है, तो उम्मीदवार वास्तव में मुझे उस तरह की चीजें नहीं बता सकते हैं जो वह हासिल कर सकते थे वे वहां थे।
जाहिर है क्योंकि जावा (और असुरक्षित चेक) में कच्चे प्रकार स्वीकार्य हैं, लेकिन जेनरिक को तोड़ना और List<Integer>
उस के साथ अंत करना संभव है (उदाहरण के लिए) वास्तव में String
एस। यह स्पष्ट रूप से असंभव प्रस्तुत किया जा सकता है प्रकार की जानकारी को पुन: प्रमाणित किया गया; लेकिन इस से अधिक होना चाहिए !
क्या लोग उन चीजों के उदाहरण पोस्ट कर सकते हैं जो वे वास्तव में करना चाहते हैं , क्या जेनेरिक उपलब्ध थे? मेरा मतलब है, जाहिर है कि आप एक List
रनटाइम के प्रकार प्राप्त कर सकते हैं - लेकिन आप इसके साथ क्या करेंगे?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
संपादित करें : उत्तर के रूप में इसका एक त्वरित अद्यतन मुख्य Class
रूप से एक पैरामीटर (उदाहरण के लिए EnumSet.noneOf(TimeUnit.class)
) के रूप में पारित करने की आवश्यकता के बारे में चिंतित प्रतीत होता है । मैं जहाँ यह संभव नहीं है की तर्ज पर कुछ के लिए और अधिक देख रहा था । उदाहरण के लिए:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
पैरामीटर में अनदेखी करना होगा, लेकिन defineClass()
नहीं कर सकता)। और जैसा कि हम जानते हैं, द पावर्स बी बी बैकवर्ड कम्पैटिबिलिटी सर्वोपरि है।