2010-11-17 14 views
16
public static BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode left = BTNode.treeCopy(source.left); 
     BTNode right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 

} 

मेरे प्रश्न यह है कि मैं स्थिर संदर्भ में जेनेरिक टाइप ई का उपयोग क्यों नहीं कर सकता? मैंने कई उत्तरों की खोज करने की कोशिश की जो स्नैक्स बनाने वाले किसी भी व्यक्ति को नहीं ढूंढ सका।एक स्थिर संदर्भ में जेनेरिक प्रकारों का उपयोग

+0

संभावित जेनेरिक [सामान्य वर्ग में स्टेटिक विधि?] (Http://stackoverflow.com/questions/936377/static-method-in-a-generic-class) –

उत्तर

19

आप विधि हस्ताक्षर में सामान्य प्रकार की घोषणा करने की जरूरत है:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode<E> left = BTNode.treeCopy(source.left); 
     BTNode<E> right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 
} 
7

E कुछ भी हो सकता है। E (सामान्य के रूप में) का उपयोग करने के लिए आपको किसी ऑब्जेक्ट का उदाहरण बनाना होगा। यदि आपके पास स्थैतिक विधि है तो आप ऐसा नहीं कर सकते क्योंकि सामान्य प्रकार-पैरामीटर केवल कक्षा के उदाहरण के लिए दायरे में हैं (जिसमें इसके उदाहरण विधियों और उदाहरण फ़ील्ड शामिल हैं)।

स्टेटिक सदस्य और फ़ील्ड कक्षा के प्रत्येक उदाहरण से संबंधित हैं। तो अगर आपके पास BTNode<String> का उदाहरण था और BTNode<Integer> का एक और उदाहरण था, तो स्थिर treeCopy का उपयोग वास्तव में क्या होना चाहिए? String या Integer?

एक कामकाज है; आपको स्थिर विधि को बताना होगा कि E का अर्थ क्या है। तो अगर आप इस तरह इसे परिभाषित करना होगा:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 

यह भी अपने डिजाइन में एक दूसरे लेते हैं तो यह वास्तव में है कि आप क्या चाहते को देखने के लिए मदद मिलेगी।

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