2017-09-21 3 views
5

मैं निम्नलिखित वर्ग generify कोशिश कर रहा हूँ:।Generifying सरणी प्रकार जैसे वस्तु [] वर्ग

public class FooService { 

    private Client client; 

    public Foo get(Long id) { 
    return client.get(id, Foo.class); 
    } 

    public List<Foo> query() { 
    return Arrays.asList(client.get(Foo[].class)); 
    } 

} 

सब कुछ Foo[].class को छोड़कर ठीक है:

public abstract class BaseService<T, I> { 

    private Client client; 
    private Class<T> type; 

    public BaseService(Class<T> type) { 
    this.type = type; 
    } 

    public T get(I id) { 
    return client.get(id, type); 
    } 

    public List<T> query() { 
    return Arrays.asList(client.get(/* What to pass here? */)); 
    } 

मैं कैसे Foo[].class गुजर बिना इस समस्या को हल कर सकते हैं कन्स्ट्रक्टर में मैंने Foo.class के साथ किया है?

उत्तर

4

जावा में तत्व वर्ग से सीधे सरणी कक्षा प्राप्त करने के लिए सुविधाओं की कमी है। एक आम काम के आसपास एक शून्य लंबाई सरणी से वर्ग प्राप्त करने के लिए है:

private Class<T> type; 
private Class arrType; 

public BaseService(Class<T> type) { 
    this.type = type; 
    arrType = Array.newInstance(type, 0).getClass(); 
} 

अब आप client.get(...) विधि के लिए arrType पारित कर सकते हैं।

+0

मैं वह भी सोचा है, लेकिन फिर विचार मुझे चेतावनी दी है और 'अनियंत्रित कलाकारों का कहना है: ...'। क्या इसके लिए कोई कामकाज भी है? –

+0

@ s.alem क्या यह आपको 'client.get' को कॉल करने या कन्स्ट्रक्टर में' एआरटी टाइप 'सेट करने के बिंदु पर चेतावनी देता है? – dasblinkenlight

+0

क्षमा करें, ऐसा तब होता है जब मैं 'arrType' के लिए 'कक्षा ' सेट करता हूं। जब मैं इसे 'कक्षा' के रूप में परिभाषित करता हूं, तो वह वहां शिकायत नहीं करता है। हालांकि यह 'अनचेक असाइनमेंट: ...' विधि कॉल 'क्लाइंट.get (arrType)' कहता है। मैं इसके साथ रह सकता हूं, लेकिन अगर कोई कामकाज हो तो यह अच्छा होगा। –

1

क्यों आप कुछ इस तरह करते हैं नहीं:

public class Client<T> { 

    T instance; 

    T get(long id) { 
     return instance; 
    } 

    List<T> get(){ 
     return new ArrayList<>(); 
    } 
} 

class FooService<T> { 

    private Client<T> client; 

    public T get(Long id) { 
     return client.get(id); 
    } 

    public List<T> query() { 
     return client.get(); 
    } 

} 
+0

यह शायद इस सरलीकृत उदाहरण में दिखाई नहीं दे रहा है, लेकिन ग्राहक वास्तव में मेरी पहुंच (तृतीय पक्ष) से ​​बाहर है। तो इसे सेवा परत में संभाला जाना है। तो मेरे मामले में क्लाइंट को दूसरी कक्षा के साथ लपेटने में केवल एक ही समस्या को दूसरी परत पर ले जाती है। लेकिन वैसे भी धन्यवाद। –

+1

मुझे खुशी है कि आपको सही उत्तर मिल रहा है :) सम्मान – Bender

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