2014-06-08 30 views
5

के साथ अमूर्त वर्ग की तत्काल वस्तु ऑय लोग उम्मीद कर रहे थे कि आप मेरी मदद कर सकें।जेनेरिक प्रकार

मूल रूप से मैं एक सामान्य प्रकार के साथ एक फ़ंक्शन बना रहा हूं और सामान्य प्रकार एक सार प्रकार है जिसे मुझे तुरंत चालू करने की आवश्यकता है। इस कोड को यह अधिक स्पष्ट रूप से समझा जाएगा:

public <T extends AbstractRow> foo(){//no I did not actually name the function foo 
    ArrayList<T> arr=new ArrayList<T>(); 
    arr.add(new T(...)); //cant instantiate objects of abstract class 


} 

मूल रूप से मैं लागू करने के लिए "टी AbstractRow फैली लेकिन खुद सार नहीं है" चाहते

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

+0

जब तक आप सार तरीकों के सभी लागू आप एक अमूर्त वर्ग का दृष्टांत नहीं कर सकते। – user184994

+0

मुझे एहसास है कि। मुझे एक 'वर्कअराउंड' या इस तरह के एक कार्यान्वयन कार्य को बनाने के बारे में कुछ विचार चाहिए जहां मुझे जेनेरिक प्रकार –

+0

दोस्तों के किसी ऑब्जेक्ट को तुरंत चालू करने की आवश्यकता है, क्योंकि आप सामान्य प्रकारों को तुरंत कब चालू कर सकते हैं? – drewmoore

उत्तर

3

आपका मुख्य मुद्दा यह नहीं है कि आप एक अमूर्त वर्ग के साथ काम कर रहे हैं - इस मामले में टिप्पणियों में पोस्ट किए गए सुझाव उपयोगी होंगे। बड़ी समस्या यह है कि आप सीधे एक सामान्य प्रकार को तुरंत चालू करने की कोशिश कर रहे हैं (पढ़ें: new T()) - जो, बस रखें, आप type erasure की वजह से जावा में नहीं कर सकते हैं।

/**@param clazz the subclass you want to instantiate */ 
public <T extends AbstractRow> foo(Class<T> clazz) { 
    ArrayList<T> arr = new ArrayList<T>(); 
    arr.add(clazz.newInstance); //instantiate new instance of given subclass 
} 

उपयोग::

abstract class Test1 {} 
class Test2 extends Test1{ } 

class Test<T> { 
    public static <T extends Test1> T foo(Class<T> clazz) { 
    T toReturn = null; 
    try{ toReturn = clazz.newInstance(); } catch (Exception e) { }; 
    return toReturn ; 
    } 

    public static void main(String[] args) { 
    Test1 t1 = t.foo(test2.class); 
    System.out.println(t1.getClass()); //prints "class pkgname.test2" 
    } 
} 
4

जहाँ तक मुझे पता है, वहाँ दो तरीके यह करना है:

  1. एक Class<T> type जोड़े

    कहा, वहाँ हमेशा एक समाधान है अपने अमूर्त जेनेरिक वर्ग में फ़ील्ड, और इसे कन्स्ट्रक्टर (या अन्य विधि) के माध्यम से सेट करें। ऑब्जेक्ट बनाने के लिए आप type.newInstance() का आह्वान कर सकते हैं।

  2. विधि के साथ एक फैक्टरी इंटरफ़ेस Factory<T> बनाएं और इसे अपने सारणी वर्ग (या किसी अन्य विधि) के माध्यम से अपने सारणी के क्षेत्र के रूप में सेट करें। अपनी जेनेरिक कक्षा का ठोस उदाहरण बनाने पर, आपको भी कारखाने के ठोस कार्यान्वयन को पारित करना होगा।
import java.util.ArrayList; 
import java.util.List; 

public class Generic<T> { 
    private Factory<T> factory; 

    public Generic(Factory<T> factory) { 
     this.factory = factory; 
    } 

    public void foo() { 
     List<T> list = new ArrayList<>(); 

     list.add(factory.create()); 
    } 
} 

interface Factory<T> { 
    T create(); 
} 

उपयोग:

Generic<Bar> concrete = new Generic<>(new Factory<Bar>() { 
    @Override 
    public Bar create() { 
     return new Bar(); 
    } 
}); 

concrete.foo(); 
संबंधित मुद्दे