2010-06-29 10 views
6

के भीतर मेरे कोड एकइसके अमूर्त सुपरक्लास के भीतर एक उप-वर्ग के सामान्य प्रकार का उपयोग करना?

public class ChildClassA extends AbstractClass<GenericTypeA> {...} 

public class ChildClassB extends AbstractClass<GenericTypeB> {...} 

की तरह अमूर्त सुपर क्लास

public abstract class AbstractClass<Type extends A> {...} 

और कुछ बच्चे कक्षाओं निम्नलिखित है मैं एक सुंदर तरीका है कि कैसे मैं बच्चे कक्षाओं के सामान्य प्रकार का उपयोग कर सकते हैं (के लिए खोज कर रहा हूँ जेनेरिक टाइप, जेनेरिक टाइप, ...) एक सामान्य तरीके से अमूर्त वर्ग के अंदर।

इस समस्या को मैं वर्तमान में मेरे सार कक्षा में विधि परिभाषित

protected abstract Class<Type> getGenericTypeClass(); 

को सुलझाने और हर बच्चे को कक्षा में विधि लागू

@Override 
protected Class<GenericType> getGenericTypeClass() { 
    return GenericType.class; 
} 

करने के लिए।

क्या इस सहायक विधि को लागू किए बिना मेरे अमूर्त वर्ग में सामान्य प्रकार के बाल वर्गों को प्राप्त करना संभव है?

बीआर,

मार्कस

उत्तर

10

मुझे लगता है कि यह संभव है। मैंने देखा कि यह जेनिक्स के साथ डीएओ पैटर्न में इस्तेमाल किया जा रहा था। जैसे पर विचार करें कक्षाएं:

public class A {} 
public class B extends A {} 

और अपने सामान्य वर्ग:

import java.lang.reflect.ParameterizedType; 
    public abstract class Test<T extends A> { 

    private Class<T> theType; 

    public Test() { 
     theType = (Class<T>) (
       (ParameterizedType) getClass().getGenericSuperclass()) 
       .getActualTypeArguments()[0]; 
    } 

    // this method will always return the type that extends class "A" 
    public Class<T> getTheType() { 
     return theType; 
    } 

    public void printType() { 
     Class<T> clazz = getTheType(); 
     System.out.println(clazz); 
    } 
    } 

आप एक वर्ग Test1 कि वर्ग बी के साथ टेस्ट फैली हो सकता है (यह फैली हुई है एक)

public class Test1 extends Test<B> { 

    public static void main(String[] args) { 
     Test1 t = new Test1(); 

     Class<B> clazz = t.getTheType(); 

     System.out.println(clazz); // will print 'class B' 
     System.out.println(printType()); // will print 'class B' 
    } 
    } 
+0

मुझे समझ में नहीं आता कि टेस्ट के निर्माता में कोड वास्तव में क्या करता है, लेकिन यह काम करता है। अब मुझे अब सहायक सहायक तरीकों का उपयोग करने की ज़रूरत नहीं है। धन्यवाद :-) – Markus

+2

यह प्रतिबिंब का उपयोग करता है।सबसे पहले यह कक्षा के जेनेरिक सुपरक्लास (java.lang.reflect.Type) को प्राप्त करता है, हमारे मामले में यह कभी भी शून्य नहीं होगा और हम जानते हैं कि यह एक पैरामीटरेट टाइप है, इसलिए हमने इसे कास्ट किया और विधि को निष्क्रिय करने के लिए एक्टुअल टाइप टाइप करें जो एक सरणी देता है वास्तविक प्रकार के तर्क उदा बी, प्रकार के। – naikus

+0

अहह, आपके स्पष्टीकरण के लिए धन्यवाद। – Markus

0

मुझे यकीन है कि मैं पूरी तरह से अपने प्रश्न समझ में नहीं हूँ - <Type> है उपवर्ग के जेनेरिक प्रकार, तब भी जब यह अमूर्त वर्ग में व्यक्त किया जा रहा है। उदाहरण के लिए, अपने सार सुपर क्लास के लिए एक विधि को परिभाषित करता है, तो:

public void augment(Type entity) { 
    ... 
} 

और आप का दृष्टांत एक ChildClassA, आप केवल GenericTypeA का एक उदाहरण के साथ augment कॉल करने के लिए सक्षम हो जाएगा।

अब यदि आप कक्षा शाब्दिक चाहते हैं, तो आपको बताए गए तरीके को प्रदान करने की आवश्यकता होगी। लेकिन अगर आप सामान्य पैरामीटर चाहते हैं, तो आपको कुछ विशेष करने की आवश्यकता नहीं है।

+0

क्षमा करें, मैं डॉन वास्तव में आपका मुद्दा नहीं मिला है। प्रकार उप वर्गों के सामान्य प्रकारों द्वारा बढ़ाया जाता है। इसलिए उप वर्ग के प्रकार को वापस टाइप करना और अमूर्त सुपर क्लास के अंदर इसका उपयोग करना संभव है। – Markus

+0

@ मार्कस - अब * मैं * आपकी दूसरी वाक्य को समझ नहीं पा रहा हूं, मुझे नहीं लगता कि यह समझ में आता है। आप किसी भी प्रकार में एक प्रकार पैरामीटर नहीं डाल सकते हैं; कक्षा परिभाषा में यह केवल एक प्लेसहोल्डर है जिस प्रकार आप वास्तव में एक ऑब्जेक्ट बनाते हैं। और subclasses * विस्तार * प्रकार नहीं है, वे इसके लिए एक ठोस बाध्य प्रदान करते हैं। इसलिए जब 'चाइल्ड क्लास' के उदाहरण के लिए 'सार क्लास' में विधियां लागू की जा रही हैं, तो 'टाइप' ** **' जेनेरिक टाइप 'है। –

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