2017-10-19 10 views
8

में उपयोग कक्षा पैरामीटर मैं निम्नलिखित वर्ग है:जावा विधि पैरामीटर

public class Publisher<T> { 

    private static final Class[] SUPPORTED_CLASSES = new Class[]{T1.class, T2.class}; 

    public Publisher() { 
     if(Arrays.asList(SUPPORTED_CLASSES).contains(T)) { // error: expression expected! 
      System.out.println("Class not supported!"); 
     } 
    } 
} 

मैं कैसे जांच कर सकते हैं वर्ग पैरामीटर कार्यान्वयन के अनुरूप है तो क्या होगा?
उपर्युक्त उदाहरण में मैं पैरामीटर के रूप में कक्षा पैरामीटर टी का उपयोग नहीं कर सकता।

+0

इस धागे को जांचें https://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime –

+3

यदि आप पूछ सकते हैं, तो आप इसे क्यों चाहते हैं? –

+0

@MCEmperor मैं यह जांचना चाहता था कि कक्षा समर्थित है या आवश्यक होने पर चेतावनी संदेश लॉग करें – FazoM

उत्तर

13

आप type erasure की वजह से, क्रम में एक सामान्य प्रकार है, जो इस मामले में काम नहीं करता है का उपयोग करने की कोशिश कर रहे हैं क्यों यह काम नहीं करता।

इस निर्माता में एक Class<T>, जो आप रन टाइम पर प्रकार दे देंगे लेने के लिए है ठीक करने के लिए सबसे आसान तरीका है, तो आप देख सकते हैं कि सूची मूल्य आप दिया गया है शामिल ठीक करने के लिए कैसे ।

उदाहरण कोड

public Publisher(Class<T> clazz) { 
    if(!SUPPORTED_CLASSES.contains(clazz)) { 
     System.out.println("Class not supported!"); 
    } 
} 

संभावित मुद्दों

आपका कोड वर्तमान में उपप्रकार है, जो समस्याएँ उत्पन्न कर सकते, जब तक आप इससे सहमत हैं, का समर्थन नहीं करता (आप सूचियों पर काम कर सकते हैं, लेकिन जरूरी नहीं कि ArrayLists) , हालांकि यह LSP बीक है।

+0

को भ्रमित कर रहा था, मैं कहूंगा कि ओपी का कोड काम नहीं करने का एक और अधिक मौलिक कारण यह है कि' टी 'नाम * प्रकार * वस्तुओं नहीं।विशेष रूप से, वे समान नहीं हैं और 'java.lang.Class' प्रकार की वस्तुओं का प्रतिनिधित्व नहीं करते हैं, जैसे ओपी के सरणी में शामिल हैं। प्रकार सामान्य तर्क मान्य नहीं हैं। –

+0

एलएसपी केवल एक समस्या है यदि ओपी की कक्षा टी में संविधान होना चाहिए। यदि यह अनुबंध है या परिवर्तनीय है, तो यह चीजों को करने का एक पूरी तरह से कानूनी (अगर अजीब और गैर-ओओपी) तरीका है। – Kevin

4

आप निर्माता में कक्षा उत्तीर्ण होना होगा:

public Publisher(Class<T> clazz) { 
    if(!SUPPORTED_CLASSES.contains(clazz)) { 
     System.out.println("Class not supported!"); 
    } 
} 

क्योंकि T रनटाइम पर उपलब्ध नहीं है: ठीक उसी कोड new Publisher<T1>() और new Publisher<T3>() के लिए क्रियान्वित की जाएगी।

6

हालांकि कुछ अन्य उत्तर काफी अच्छा कर रहे हैं, मैं एक वैकल्पिक हल प्रस्ताव करने के लिए करना चाहते हैं:

आप एक खाली इंटरफ़ेस MyInterface बना सकते हैं, और अपनी सूची में सभी वर्गों है इस इंटरफ़ेस को लागू। फिर, आप अपनी कक्षा घोषणा को बदल सकते हैं:

public class Publisher<T extends S, MyInterface> 

जो आपके उद्देश्य को प्राप्त करेगा।

+1

यह एक बेहतर समाधान है यदि आपके पास समर्थन करने के लिए आवश्यक सभी कक्षाओं का नियंत्रण है, लेकिन यदि आपको उन वर्गों का समर्थन करने की आवश्यकता है जिन्हें आपने लिखा नहीं है तो आपको इसे अलग तरीके से करने की आवश्यकता हो सकती है। सबसे खराब मामले में – jrtapsell

+1

@jrtapsell, यदि आपको इंटरफ़ेस – AxelH

+0

को लागू करने वाले प्रत्येक वर्ग के लिए एक पुल का उपयोग करके बहुत अधिक कक्षा का समर्थन करने की आवश्यकता नहीं है, तो आपका समाधान केवल उन वर्गों के साथ काम करता है जो विशिष्ट को लागू करते हैं इंटरफ़ेस, आपको अब संगत कक्षाओं की उस सूची की आवश्यकता नहीं है और केवल कक्षा को 'पब्लिक क्लास प्रकाशक' के रूप में घोषित कर सकता है <टी MyInterface> – Philipp

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