2012-04-11 9 views
53

मैं इस तरह की चीज़ को काम करने के लिए कैसे प्राप्त कर सकता हूं? मैं जांच सकता हूं कि (obj instanceof List<?>) है लेकिन (obj instanceof List<MyType>) नहीं है। क्या ऐसा कोई तरीका है?सूची <MyType> कैसे उदाहरण के लिए?

+1

देखें http://docs.oracle.com/javase/tutorial/java/generics/erasure.html की [parameteri के खिलाफ जांच instanceof नहीं जा सकता –

+0

संभव डुप्लिकेट जेड प्रकार ArrayList ] (http://stackoverflow.com/questions/7335018/cannot-perform-instanceof-check-against-parameterized-type-arraylistfoo) –

उत्तर

35

यह संभव नहीं है क्योंकि जेनेरिक के संकलन समय पर डाटाटाइप मिटा देता है।

public class GenericList <T> extends ArrayList<T> 
{ 
    private Class<T> genericType; 

    public GenericList(Class<T> c) 
    { 
      this.genericType = c; 
    } 

    public Class<T> getGenericType() 
    { 
      return genericType; 
    } 
} 
+0

ठीक है क्या इसे जांचने का कोई वैकल्पिक तरीका है? –

+0

धन्यवाद, मुझे लगता है कि मैं जेनेरिक प्रकार को उस फ़ंक्शन में पास कर दूंगा जिसे मैं कॉल कर रहा हूं और दोनों आइटमों की जांच कर रहा हूं। –

8

आप शायद प्रतिबिंब का उपयोग करने की जांच करने के लिए उन्हें के प्रकार प्राप्त करने की आवश्यकता: ऐसा करने का केवल संभव तरीके आवरण किसी तरह का है कि रखती है जो प्रकार सूची रखती है लिखने के लिए है। सूची के प्रकार के प्राप्त करने के लिए: Get generic type of java.util.List

+1

जहाँ तक मुझे पता है, यह केवल फ़ील्ड के लिए काम करता है, लेकिन इसका उल्लेख करने के लिए +1। –

16
if(!myList.isEmpty() && myList.get(0) instanceof MyType){ 
    // MyType object 
} 
+0

... और एक खाली सूची के लिए? कुछ विचार? – Gewure

+0

हाँ। खाली सूची के लिए यह एकमात्र विकल्प उपलब्ध है। https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list – Sathish

+1

यह उत्तर सुरक्षित नहीं है, क्योंकि यदि 0 तत्व एक MyType है, तो अन्य तत्व अन्य प्रकार हो सकते हैं । उदाहरण के लिए, शायद सूची को ArrayList के रूप में घोषित किया गया था, फिर एक MyType जोड़ा गया था, और फिर एक स्ट्रिंग जोड़ा गया था। –

0

आप सत्यापित कर रहे हैं, तो वस्तु की एक सूची या मानचित्र मूल्य का एक संदर्भ एक संग्रह का एक उदाहरण है, बस आवश्यकता सूची का एक उदाहरण बना सकते हैं और प्राप्त अपने वर्ग ...

Set<Object> setOfIntegers = new HashSet(Arrays.asList(2, 4, 5)); 
assetThat(setOfIntegers).instanceOf(new ArrayList<Integer>().getClass()); 

Set<Object> setOfStrings = new HashSet(Arrays.asList("my", "name", "is")); 
assetThat(setOfStrings).instanceOf(new ArrayList<String>().getClass()); 
+0

आपके 'setOfIntegers' और' setOfStrings' का बिंदु क्या है? – DanielM

+0

@DanielM ने अभी नमूना अपडेट किया है। यह उन संदर्भों का उपयोग करना चाहिए! धन्यवाद! –

0

इस हैं (@ Martijn का जवाब) यह (जाँच पहला तत्व के प्रकार कुछ भी नहीं की गारंटी देता है) निरर्थक सूची यात्रा से बचने के लिए कास्टिंग के बिना इसे पारित करने के बेहतर है जेनरिक के साथ लिपटे नहीं किया जा सकता। हम प्रत्येक तत्व को कोड के टुकड़े में डाल सकते हैं जहां हम सूची को पुन: सक्रिय करते हैं।

Object attVal = jsonMap.get("attName"); 
List<Object> ls = new ArrayList<>(); 
if (attVal instanceof List) { 
    ls.addAll((List) attVal); 
} else { 
    ls.add(attVal); 
} 

// far, far away ;) 
for (Object item : ls) { 
    if (item instanceof String) { 
     System.out.println(item); 
    } else { 
     throw new RuntimeException("Wrong class ("+item .getClass()+") of "+item); 
    } 
} 
0

इसके बजाय आप instanceof का उपयोग कर के कई तरीके शामिल करने के लिए एक नकली कारखाने का उपयोग कर सकते हैं:

public class Message1 implements YourInterface { 
    List<YourObject1> list; 
    Message1(List<YourObject1> l) { 
     list = l; 
    } 
} 

public class Message2 implements YourInterface { 
    List<YourObject2> list; 
    Message2(List<YourObject2> l) { 
     list = l; 
    } 
} 

public class FactoryMessage { 
    public static List<YourInterface> getMessage(List<YourObject1> list) { 
     return (List<YourInterface>) new Message1(list); 
    } 
    public static List<YourInterface> getMessage(List<YourObject2> list) { 
     return (List<YourInterface>) new Message2(list); 
    } 
} 
0

यह किया जा सकता है आपको लगता है कि object जाँच करना चाहते हैं, तो List<T> का उदाहरण है, जो खाली नहीं है:

if(object instanceof List){ 
    if(((List)object).size()>0 && (((List)object).get(0) instanceof MyObject)){ 
     // The object is of List<MyObject> and is not empty. Do something with it. 
    } 
} 
संबंधित मुद्दे