दिलचस्प पोस्ट
अपने मूल तत्वों के आधार पर किसी तत्व को सीएसएस शैलियों को लागू करें SQL त्रुटि: कीवर्ड 'उपयोगकर्ता' के निकट गलत वाक्यविन्यास WPF में एक बटन माउसओवर के लिए पृष्ठभूमि कैसे बदलें? MVC- जैसे पृष्ठ पर सुंदर यूआरएल पर आधारित वर्गों को लोड कैसे करें? पायथन में ग्राफ़ (डेटा संरचना) का प्रतिनिधित्व करना फ़ंक्शन में जेएस वेरिएबल का मान (संदर्भ नहीं) मैं कैसे पास कर सकता हूं? आयात com.sun.image.codec.jpeg। * लैम्ब्डा अभिव्यक्ति में पैरामीटर को बदलें हम कैसे जांच सकते हैं कि कोई फ़ाइल मौजूद है या Win32 प्रोग्राम का उपयोग नहीं कर रहा है? सभी उपलब्ध कमांड और उपनामों को सूचीबद्ध करने के लिए लिनक्स कमांड एक टुकड़ा (हनीकॉब) में मानचित्रदृश्य GitHub API पर बुनियादी प्रमाणीकरण के लिए उपयोगकर्ता नाम और पासवर्ड के साथ Invoke-WebRequest का उपयोग करें माता-पिता के देखने में उपयोगकर्ता इंटरैक्शन सक्षम होने पर छू पाने के लिए कैसे आईओएस में नहीं प्रोग्रामेटिक रूप से रंग ग्रेडिएंट के साथ एक UIView बनाएँ एक्सपांडो ओब्जेक्ट में अज्ञात (डिजाइन समय पर) गुण जोड़ना

जावा: आदिम डेटा प्रकारों का सरणी autobox नहीं करता है

मेरे पास इस तरह एक विधि है:

public static <T> boolean isMemberOf(T item, T[] set) { for (T t : set) { if (t.equals(item)) { return true; } } return false; } 

अब मैं इस विधि को T लिए char का उपयोग करने की कोशिश करता हूं:

 char ch = 'a'; char[] chars = new char[] { 'a', 'b', 'c' }; boolean member = isMemberOf(ch, chars); 

यह काम नहीं करता है मैं char और char[] उम्मीद करूँगा ताकि Character और Character[] को ऑटोबॉक्स किया जा सके, लेकिन ऐसा नहीं लगता है।

कोई अंतर्दृष्टि?

Solutions Collecting From Web of "जावा: आदिम डेटा प्रकारों का सरणी autobox नहीं करता है"

एरे के लिए कोई ऑटोबॉक्सिंग नहीं है, केवल प्राथमिकताएं के लिए मेरा मानना ​​है कि यह आपकी समस्या है

char[] को Character[] रूप में बॉक्सिंग क्यों char[] किया जाएगा? एरे हमेशा संदर्भ प्रकार होते हैं, इसलिए कोई मुक्केबाजी आवश्यक नहीं है।

इसके अलावा, यह बेहद महंगा होगा – इसमें एक नया सरणी बनाने और फिर प्रत्येक चार मुक्केबाजी मुहैया कराएंगे। ओह!

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

 import java.lang.reflect.Array public static boolean isMemberOfArray(Object item, Object array) { int n = Array.getLength(array) for (int i = 0; i < n; i++) { if (Array.get(array, i).equals(item)) { return true; } } return false; } 

सही है, arrays के लिए कोई ऑटोबॉक्ज़िंग नहीं है (जो कि int[] ints; ...; Arrays.asList(ints) जैसे मामलों में weirdness का परिणाम है int[] ints; ...; Arrays.asList(ints) – asList एक ऑब्जेक्ट, सरणी युक्त सूची देता है!)

बॉक्स को सरणी के लिए यहां एक साधारण उपयोगिता है

 public static Integer[] boxedArray(int[] array) { Integer[] result = new Integer[array.length]; for (int i = 0; i < array.length; i++) result[i] = array[i]; return result; } 

आपको प्रत्येक आदिम प्रकार के लिए एक अलग संस्करण की ज़रूरत होगी, ज़ाहिर है।

यह डिजाइन से प्रतीत होता है, दोनों इस तरह के एक महंगी ऑटोबॉक्सिंग ऑपरेशन से बचने के लिए, और क्योंकि जेनरिक को मौजूदा जावा बाइटकोड के साथ पीछे से संगत होना चाहिए।

उदाहरण के लिए, इस लेख और इस बग को देखें।

एरेज़ कम-स्तरीय क्रियान्वयन प्रकार की चीज़ हैं char[] दो-बाइट वर्णों के साथ मेमोरी का निकटतम क्षेत्र होगा Character[] चार या आठ बाइट संदर्भों के साथ स्मृति का एक निकटतम क्षेत्र होगा। चार वर्णों को लपेटने के लिए आप एक Character[] नहीं मिलते [] हालांकि एक List<Character> एक char[] को लपेट सकता है char[]

संदर्भों का सार आमतौर पर एक अच्छा विचार नहीं है जब तक आप निम्न-स्तरीय कोड नहीं लिखते हैं। यदि आप चाहें, तो आप java.util.Arrays.asList किसी समकक्ष को लिख सकते हैं या प्राप्त कर सकते हैं। java.util.Arrays.asList

जैसा कि अन्य लोगों ने उल्लेख किया है, प्राथमिकताएं के सरणियों के लिए कोई ऑटोबॉक्सिंग नहीं है। अगर आप आदिम सरणियों के साथ अपनी विधि का उपयोग करना चाहते हैं, तो आपको प्रत्येक आदिम प्रकार के लिए अधिभार प्रदान करने की आवश्यकता होगी। यह कक्षा पुस्तकालयों में काम करने का मानक तरीका है उदाहरण के लिए, java.util.Arrays में ओवरलोड देखें।

सबसे पहले, मैं जितना आप कर सकते हैं उतनी ही सरणियों से बचने की कोशिश करेंगे, बजाय सूचियों का उपयोग करें

सरणियों के लिए कोई ऑटोबॉक्ज़िंग नहीं है, लेकिन वरार्ग के लिए ऑटोबॉक्सिंग है। इसलिए यदि आप अपनी विधि घोषित करते हैं (उसी शरीर के साथ):

 public static <T> boolean isMemberOf(T item, T ... set) 

तो आप लिख सकते हैं

 isMemberOf('a', 'a', 'b', 'c'); 

निजी तौर पर, मैं Google का अमरूद का उपयोग करना पसंद करता हूं, जहां आप चीजों की तरह लिख सकते हैं

 char ch = 'a'; char[] chars = new char[] { 'a', 'b', 'c' }; boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0])); 

आपका कोड शायद एक उदाहरण था, लेकिन अगर आप वास्तव में सदस्यता का परीक्षण करना चाहते थे, तो आप ऐसा कर सकते हैं:

 Chars.contains(chars, ch); or ImmutableSet.of('a', 'b', 'c').contains('a') 

जावा 8 दर्ज करें और primArray टाइप टाइप करें PrimType[] , तो आप निम्न कर सकते हैं:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

ऐसा करने का एक आसान तरीका है

 char ch = 'a'; String chars = "abc"; boolean member = chars.indexOf(ch) >= 0;