2016-09-23 8 views
7

मैं सामान्य विधि का उपयोग कर में एक मुसीबत से मिलनेजावा में अन्य विधि पर जेनेरिक पैरामीटर के रूप में जेनेरिक ऑब्जेक्ट को कैसे पास किया जाए?

संकलित वर्ग:

public class Something<T> { 
    public static Something newInstance(Class<T> type){}; 
    public <T> void doSomething(T input){}; 
} 

और मेरे विधि है:

public <S> void doOtherThing(S input){ 
     Something smt = Something.newInstance(input.getClass()); 
     smt.doSomething(input); // Error here 
} 

यह संकलन समय पर त्रुटि मिली:

नहीं doSomething (टी) टी के लिए उपयुक्त विधि पर कब्जा नहीं किया जा सकता # 1 ओ एफ? java.lang.Object ... फैली

मैं एक चाल इस से बचने के लिए हो सकता है लगता है, कृपया मदद

+1

आपका कोड संकलित नहीं करता है। कृपया सही स्रोत – bedrin

+0

प्रदान करें यहां बहुत सारे मुद्दे हैं। सबसे पहले दो अलग 'टी' हैं। 'कुछ' '' '' 'कुछ 'वर्ग' वर्ग के समान नहीं है, क्योंकि 'doSomething' एक सामान्य विधि है जो अपना स्वयं का' टी 'घोषित करती है। आपको दो चर अलग-अलग नाम देना चाहिए, क्योंकि वे एक दूसरे से असंबंधित नहीं हैं। फिर तथ्य यह है कि 'कुछ करना' केवल पैरामीटर प्रकार के रूप में 'टी' का उपयोग करता है, और' टी' असंबद्ध है, इसका मतलब है कि इसमें कुछ भी लगता है, इसलिए यह 'सार्वजनिक शून्य कुछ (ऑब्जेक्ट इनपुट) {} 'के बराबर है; 'टी' बेकार है। 'DoOtherThing' के साथ वही बात - यह' सार्वजनिक शून्य डूथरिंग (ऑब्जेक्ट इनपुट) ' – newacct

उत्तर

2

मुझे लगता है कि input.getClass()Class<T>

public <S> void doOtherThing(S input){ 
     Something smt = Something.newInstance((Class<T>)input.getClass()); 
     smt.doSomething(input); 
} 
+2

के साथ ठीक काम करता है यह कच्चे प्रकार और अनचेक कास्टिंग के कारण असुरक्षित है। – Bastien

0

इस तरह कुछ? (हमारे newInstance पद्धति पर सामान्य प्रकार घोषणा thingy)

public class Something<T> { 
    public static <T> Something<T> newInstance(Class<T> type){ return null; } 
    public <T> void doSomething(T input){}; 
} 
+0

नहीं है, यह गैर-जेनेरिक चर (जैसे स्ट्रिंग) – lethanh

4

लिए डाली जा जरूरत एक तर्क के रूप एस कक्षा पास।

public class Something<T> 
{ 
    public static <T> Something<T> newInstance(Class<T> type) 
    { 
     return new Something<T>(); 
    } 

    public void doSomething(T input){;} 

    public <S> void doOtherThing(Class<S> clazz, S input) 
    { 
     Something<S> smt = Something.newInstance(clazz); 
     smt.doSomething(input); 
    } 
} 
+0

इसमें 2 तर्क हैं :(लेकिन यह – lethanh

+0

काम करता है तो? क्या इससे कोई फर्क पड़ता है? इसे डूथरिंग (एसओब्जेक्ट.क्लास, एसओब्जेक्ट) के साथ कॉल करें; – Bastien

+0

लेकिन वास्तव में ऐसा करते हैं तो अन्यथा स्थिर नहीं होने पर अन्यथा बेकार है। असल में यह सिर्फ कुछ उदाहरण बना रहा है और कुछ लागू कर रहा है , सामान्य रूप से टी – Bastien

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