2015-11-23 12 views
6

मैं एक विधि कैसे लिख सकता हूं जो पैरामीटर के रूप में किसी भी प्रकार (प्राइमेटिव सहित) को किसी भी सरणी को स्वीकार करेगा?जावा में पैरामीटर के रूप में किसी सरणी को कैसे पास किया जाए?

उदाहरण के लिए, मैं निम्नलिखित कॉल के दोनों चाहते हैं काम करने के लिए:

int[] intArray = {1, 2, 3}; 
String[] strArray = {"1", "2"}; 

hasSize(intArray, 3); 
hasSize(strArray, 2); 

निकटतम मैं अब तक मिल गया है है:

public static <T> boolean hasSize(T[] array, int expectedSize) 
{ 
    return (array.length == expectedSize); 
} 

... लेकिन यह नहीं है primitives के लिए काम करते हैं।

+0

यह ऑब्जेक्ट की श्रृंखला बनाने के उपयोग कर रहा है तो तरीका है कि लिखने के लिए चर तर्क सिवाय एक जा रहा है? – cristianhh

+0

मैं वही सोच रहा था, लेकिन ऑब्जेक्ट [] प्राइमेटिव स्वीकार नहीं करेगा .. – Tomasito665

+0

संभावित डुप्लिकेट [फंक्शन जावा के पैरामीटर के रूप में एक स्ट्रिंग सरणी पास करना] (http://stackoverflow.com/questions/11698283/passing- ए-स्ट्रिंग-एरे-ए-पैरामीटर-टू-ए-फ़ंक्शन-जावा) – ha9u63ar

उत्तर

5

एक आदिम सरणी और एक वस्तु सरणी का हिस्सा नहीं है कर रहे हैं करने के लिए होगा।

तो केवल संभावना एक वस्तु और विधि की जांच के अंदर स्वीकार करने के लिए अगर यह एक सरणी

public static <T> boolean hasSize(Object x, int expectedSize) 
{ 
    return (x != null) && x.getClass().isArray() ? 
     java.lang.reflect.Array.getLength(x) == expectedSize : 
     false; 
} 

बेशक यह भी गैर सरणियों, शायद नहीं समाधान आप चाहते हैं स्वीकार करता है किया जाएगा।

इसी कारण से जेडीके ज्यादातर ऑब्जेक्ट सरणी और आदिम सरणी के लिए समान तरीकों को प्रदान करता है।

+0

पर्याप्त मेला। मुझे इसे किसी भी सरणी के पूर्ण समर्थन के लिए आदिम सरणी विधियों की पूरी बैटरी लिखनी होगी। यह एक शर्म की बात है क्योंकि प्रत्येक विधि के कार्यान्वयन को एक पैरामीटर प्रकार को छोड़कर समान होना होगा। –

1

यदि मुझे सही ढंग से याद किया जाता है, तो आप जेनेरिक सरणी नहीं बना सकते हैं जिसे आप प्राइमेटिव लेते हैं, क्योंकि प्राइमेटिव स्वयं कक्षाएं नहीं हैं और जावा जेनेरिक सिस्टम के लिए उपलब्ध नहीं हैं।

बल्कि, अपने आने वाले सरणी Object को छोड़कर एक पूर्णांक आधार वर्ग [], डबल [], आदि

0

आप इस

public class A { 

    public static void main (String[] args) { 

     int[] intArray = {1, 2, 3}; 
     String[] strArray = {"1", "2"}; 

     hasSize(Arrays.asList(intArray), 3); 
     hasSize(Arrays.asList(strArray), 2); 
    } 

    public static <T> boolean hasSize(List<T> array, int expectedSize) 
    { 
     return (array.size() == expectedSize); 
    } 
} 

यह ठीक आप क्या चाहते हैं नहीं है की तरह कुछ कर सकते हैं। लेकिन आप सरणी को सूची में पास करके जेनेरिक तंत्र का लाभ उठा सकते हैं, और ऑटोबॉक्सिंग आपके लिए काम करता है।

यदि यह दृष्टिकोण आपके लिए अच्छा है तो ठीक है, लेकिन यदि कोई अच्छा दृष्टिकोण नहीं है तो दुर्भाग्यवश सामान्य तंत्र आदिम प्रकारों का समर्थन नहीं करता है, इसलिए आपको प्रत्येक सरणी प्रकार के लिए विधि को ओवरराइड करना होगा।

+0

नहीं, यह बेकार है। यह उपयोगकर्ता को {{Arrays.asList()}} पर कॉल करने के लिए मजबूर करता है, जो यदि वे ऐसा करते हैं, तो वे {{Arrays.asList()। आकार()}} को भी कॉल कर सकते हैं और सीधे ऊपर int == int तुलना का उपयोग कर सकते हैं एक विधि लिखने के बिना। –

0

जैसा ऊपर बताया गया है कि आप आदिम सरणी और ऑब्जेक्ट सरणी को मिश्रित नहीं कर सकते हैं, आपको रैपर वर्ग का उपयोग करना होगा। समारोह vargs धारणा

public static <T> void process(T...args) { 
    System.out.println(Arrays.toString(args)); 
} 

इस धारणा जावा आंतरिक एपीआई में प्रयोग किया जाता है

संबंधित मुद्दे

 संबंधित मुद्दे