2012-08-28 20 views
9
public class Test<T>{ 

    public boolean isMember(T item) { 

     if(item instanceof Test) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

क्या यह जांचने का सही तरीका है कि आइटम कक्षा का उदाहरण है या नहीं?जांचें कि आइटम जेनेरिक क्लास

मैं कुछ खोजों के माध्यम से गया और ऐसा लगता है कि एक सामान्य वर्ग के लिए, यह काम नहीं करेगा।

+6

क्या आप यह जांचने की कोशिश कर रहे हैं कि आइटम 'टेस्ट' का उदाहरण है, 'टी' का उदाहरण है, या' टेस्ट 'का उदाहरण है? – StriplingWarrior

+0

@NinjoeQuah मेरा उत्तर देखें – GingerHead

उत्तर

5

यह स्पष्ट नहीं है कि क्या आप यहाँ परीक्षण करने के लिए कोशिश कर रहे हैं, लेकिन यहां कुछ संभावनाएं हैं:

  1. itemT है? हाँ। अन्यथा, संभवतः यह isMember विधि में पारित नहीं किया जा सका। संकलक इसे अस्वीकार कर देगा। (नीचे दी गई टिप्पणियों में एलेक्स की चेतावनी देखें।)
  2. itemTest है? आपके isMember विधि के रूप में लिखा गया है यह परीक्षण करेगा, लेकिन मैं यहाँ एक कोड गंध महसूस कर रहा हूँ। T को Test होने के लिए आप क्यों उम्मीद करेंगे, लेकिन केवल कुछ समय? आप पुनर्विचार करना चाह सकते हैं कि आप अपनी कक्षाओं का आयोजन कैसे कर रहे हैं। इसके अलावा, अगर यह सच है कि आप क्या चाहते है, तो अपने तरीके के रूप में लिखा जा सकता है:

    public boolean isMember(T item) { 
        return (item instanceof Test); 
    } 
    

    कौन सा सवाल भीख माँगता: क्यों पहली जगह में इस तरह की एक विधि है? लिखना आसान है?

    if(obj instanceof Test) {...} 
    

    या

    if(Test<Something>.isMember(obj)) {...} 
    

    मैं तर्क था कि पहले एक सरल है, और सबसे जावा डेवलपर्स समझ जायेंगे कि यह एक कस्टम विधि की तुलना में अधिक आसानी से मतलब है।

  3. itemTest<T> है? रन टाइम पर यह जानने का कोई तरीका नहीं है क्योंकि जावा एरर का उपयोग करके जेनरिक लागू करता है। यदि आप यही चाहते हैं, तो आपको माइक मायर्स के उदाहरण की तरह विधि हस्ताक्षर को संशोधित करना होगा।

+2

"कंपाइलर इसे अस्वीकार कर देगा।" - मान लें कि आप कक्षा के सभी संदर्भों में सही सामान्य हस्ताक्षर का उपयोग कर रहे हैं, यह सच है। आप अभी भी उस आइटम को पास करने के लिए कच्चे प्रकार के 'टेस्ट' के संदर्भों का उपयोग कर सकते हैं जो 'T' से' हैमम्बर 'का उदाहरण नहीं है, लेकिन यदि आप ऐसा करते हैं तो संकलक आपको सभी तरह की चेतावनियों को फेंक देगा। – Alex

0

T एक चर नहीं है, लेकिन रनटाइम पर परिभाषित कक्षा के लिए एक स्थान धारक है। जेनेरिक एक संकलित समय सुविधा है, इस कारण से वे संकलन समय पर चेक जोड़ते हैं जिनके पास रनटाइम पर कोई अर्थ नहीं हो सकता है। हम केवल रनटाइम पर संदर्भित ऑब्जेक्ट के प्रकार की जांच कर सकते हैं जो कोड में एक सुपर क्लास प्रकार हो सकता है।

void genericMethod(Class<T> tClass) { 
    if(String.class.isAssignableFrom(tClass)) 

या

void genericMethod(Class<T> tClass, T tArg) { 

नोट उस प्रकार नहीं हो सकता है: हम विधि के लिए पैरामीटर के रूप में प्रकार T पारित करने के लिए चाहते हैं, हम सभी यह करना है जैसे निम्नलिखित स्पष्ट दृष्टिकोण है एक ही यहाँ के रूप में हम देख सकते हैं कि हेरफेर करने के लिए:

genericMethod(Number.class, 1); 
0

सार्वजनिक वर्ग LinkList {

public boolean isMemberOfClass(T item) { 

    if(item instanceof LinkList) 
    { 
     return true; 
    } 
    return false; 
} 

}

मैं माफी चाहता हूँ, मैं जवाब के रूप में प्रश्न पोस्ट करने के suppost नहीं हूँ।

वर्ग लिंकलिस्ट एक सामान्य वर्ग है। फ़ंक्शन यह जांचना है कि आइटम कक्षा से संबंधित है या नहीं। जांचें कि क्या एक ही टी

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