2009-02-09 23 views
20

में जावा वाइल्डकार्ड के समतुल्य क्या है मैं एक ऐसे अनुप्रयोग को विकसित कर रहा हूं जहां मुझे एक सामान्य वर्ग की विधि का आह्वान करने की आवश्यकता है और मुझे वास्तविक प्रकार के उदाहरणों की परवाह नहीं है। निम्नलिखित जावा कोड की तरह कुछ:सी # जेनेरिक

public class Item<T>{ 
    private T item; 

    public doSomething(){...} 
} 

... 
public void processItems(Item<?>[] items){ 
for(Item<?> item : items) 
    item.doSomething(); 
} 

समय मैं जल्दी पर था, इसलिए मैं तरीकों मैं आह्वान करने के लिए की जरूरत के साथ एक इंटरफेस को परिभाषित करते हुए मेरी समस्या हल और सामान्य वर्ग इसे लागू कर दिया।

public interface IItem 
{ 
    void doSomething(); 
} 

public class Item<T> : IItem { 
    private T item; 

    public void doSomething(){...} 
} 

... 
public void processItems(IItem[] items) 
{ 
foreach(IItem item in items) 
    item.doSomething(); 
} 

इस तरीके को ठीक काम करता है, लेकिन मुझे पता है कि एक ही व्यवहार प्राप्त करने के लिए सही तरीका है क्या करना चाहते हैं।

संपादित करें:

मैं उल्लेख करने के लिए कि processItems के फोन करने वाले वास्तविक प्रकार पता नहीं है भूल गया। दरअसल विचार यह था कि processItems पर तर्क के रूप में पारित सरणी अंतःस्थापित प्रकार हो सकती है। चूंकि .NET में ऐसी कोई सरणी नहीं है, इसलिए गैर-सामान्य बेस क्लास या इंटरफ़ेस का उपयोग करना एकमात्र तरीका है।

उत्तर

25

यह करने के लिए विधि सामान्य बनाने के लिए किया जाएगा सामान्य तरीके:

public void ProcessItems<T>(Item<T>[] items) { 
    foreach(Item<T> item in items) 
    item.DoSomething(); 
} 

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

Item<int> items = new Item<int>(); // And then populate... 
processor.ProcessItems(items); 

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

+0

ब्लैग, कुछ सेकंड जल्द ही। : पी –

+0

हाँ, मुझे भी मारो। क्या आप कॉलर के उदाहरण के साथ संपादित कर सकते हैं, यद्यपि? –

+0

बस 'प्रोसेस इटम्स (डेटा); ' –

1

कोई भी तरीका नहीं है कि आप .NET जेनेरिक कार्यान्वयन में टाइप पैरामीटर्स को छोड़ सकते हैं; यह डिजाइन द्वारा है। वास्तव में, यह केवल जावा में अपने टाइप-एरर-आधारित कार्यान्वयन के कारण हासिल किया जा सकता है।

आप केवल आधार गैर-जेनेरिक इंटरफ़ेस का उपयोग कर सकते हैं (IEnumerable<T> और IEnumerable सोचें)।

0

जॉन की पोस्ट के आगे। विधि जेनेरिक (टेम्पलेट) इस प्रकार की कार्यक्षमता के लिए आवश्यकता को अस्वीकार करता है (< का उपयोग कर? >)। आप हमेशा एक सामान्य वर्ग/फ़ंक्शन में एक प्रकार को खिला सकते हैं और उन मामलों के लिए जहां आपको नहीं पता कि आपको किस प्रकार की आवश्यकता होगी, आप अपमानजनक विधि/कक्षा जेनेरिक भी बना सकते हैं ... आखिर में उपयोगकर्ता को कॉल करते समय एक प्रकार प्रदान करना होगा कोड को संकलित करने में सक्षम होने के लिए, ऐसा फ़ंक्शन या जेनेरिक क्लास का उपयोग करना ... अन्यथा आपको कुछ कंपाइलर त्रुटियां मिलेंगी।

3

मुझे लगता है कि आप केवल कुछ पैरामीटर के साथ कुछ विधि का आह्वान करना चाहते हैं ... इसके लिए पहले से ही एक अनुबंध है: Action

public void processItems(IEnumerable<Action> actions) 
{ 
    foreach(Action t in actions) 
    t(); 
} 

ग्राहक:

List<Animal> zoo = GetZoo(); 
List<Action> thingsToDo = new List<Action>(); 
// 
thingsToDo.AddRange(zoo 
    .OfType<Elephant>() 
    .Select<Elephant, Action>(e => e.Trumpet)); 
thingsToDo.AddRange(zoo 
    .OfType<Lion>() 
    .Select<Lion, Action>(l => l.Roar)); 
thingsToDo.AddRange(zoo 
    .OfType<Monkey>() 
    .Select<Monkey, Action>(m => m.ThrowPoo)); 
// 
processItems(thingsToDo); 
0

मैं एक ही मुद्दे के साथ संघर्ष कर रहा है, जब यह है जहाँ मैं

if (o instanceof Collection<?>) doSoemthing((Collection<?>)o); 

तरह निर्माणों लिया है जावा से पोर्टिंग सामान के लिए आया था सौभाग्य से यह बदल जाता है यह कि एक सामान्य आईसीओलेक्शन भी एक गैर-सामान्य आईसीलेक्शन है और यदि किसी को शुद्ध वस्तुओं के रूप में तत्वों का इलाज करने की आवश्यकता है तो यह अभी भी संभव है:

if (o is ICollection) DoSomething((ICollection)o); 

इस तरह, चूंकि हम संग्रह में वास्तविक प्रकार के तत्वों की परवाह नहीं करते हैं, हम सभी यहां वस्तुएं हैं। यहां एक नोट: यदि संग्रह आदिम प्रकार (उदाहरण के लिए int या बाइट) आयोजित कर रहा था तो ऑटोबॉक्सिंग किक्स जिसमें प्रदर्शन जुर्माना लागू हो सकता है।

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