2012-04-10 10 views
15

मेरे पास एक सर्वलेट है, जो क्वेरी पैरा पर पारित होता है, डीएओ से वस्तुओं की एक सूची प्राप्त करता है, सूची को जेएसओएन में बदल देता है, और इसे प्रतिक्रिया में वापस भेजता है। प्रत्येक सूची वस्तुओं के लिए एक विधि है से बना है:आप किसी ऑब्जेक्ट को एक इंटरफ़ेस को लागू करने वाली सूची <ऑब्जेक्ट्स को कैसे पास कर सकते हैं?

public String getAsJson(){...} 

और सर्वलेट ज्यादातर indentical तरीकों कि तरह लग रहे का एक समूह है:

private String getUserListAsJson() { 
    List<User> userList = this.dao.getUsers(); 
    StringBuilder builder = new StringBuilder(); 
    builder.append('['); 
    // loops over the list appending the value of each objects getAsJson() 
    builder.append(']'); 
    return builder.toString(); 
} 
समस्या

मैं के बारे में 6 तरीकों है (और है बढ़ रहा है) जो अलग-अलग डीएओ प्रश्नों को छोड़कर बिल्कुल ठीक दिखता है। मेरा विचार एक इंटरफ़ेस बनाना था जिसमें केवल GetAsJson() विधि की परिभाषा थी, प्रत्येक बीन को कार्यान्वित करें, और उसके बाद सर्वलेट में एक और तरीका है जो उस इंटरफेस को लागू करने वाली ऑब्जेक्ट्स लेता है। समाप्त हो गया इस तरह की तलाश में:

public Interface JsonEnabled { 
    public String getAsJson(); 
} 

public class User implements JsonEnabled { 
    .... 
    @Override 
    public String getAsJson() {...} 
} 

public class TheServlet { 
    ... 
    private String getUserListAsJson() { 
     List<User> userList = this.dao.getUsers(); 
     return this.getListAsJson(userList); 
    } 
    private String getListAsJson(List<? implements JsonEnabled> list) { 
     // The loop code that is in each method. 
    } 
} 

तो अगर किसी को वास्तव में इस पढ़ा है अब तक = पी, कि संकलन नहीं है और Oracle से कुछ प्रलेखन ऊपर देखने के बाद, आप केवल लागू करता प्रदान करता है और नहीं हो सकता है जेनेरिक पैरामीटर के लिए। सभी वर्गों को एक सार कक्षा से विस्तारित करना है जो अभी प्राप्त है एएसजेसन() विधि अर्थपूर्ण रूप से समझ में नहीं आता है (कक्षाएं असंबंधित हैं)।

मुझे SO पर अच्छा समाधान नहीं मिला है या बस चारों ओर गुगल रहा है, इसलिए किसी भी मदद/अंतर्दृष्टि की सराहना की जाएगी। - यह अनिवार्य रूप से "है, या फैली हुई है, या औजार" के लिए अनुवाद

private String getListAsJson(List<? extends JsonEnabled> list) { ... } 

extends जब सामान्य सीमा को परिभाषित करने के लिए इस्तेमाल किया थोड़ा अलग अर्थ है:

+1

स्पर्शकीय लेकिन क्या आप वास्तव में JSON तारों को स्वयं बनाना चाहते हैं? जैक्सन या किसी अन्य लाइब्रेरी का उपयोग करने का सुझाव दें –

उत्तर

36
सामान्य वाइल्डकार्ड कीवर्ड दोनों वर्गों और इंटरफेस के लिए extends काम करता है के लिए

+0

धन्यवाद! इसने एकदम जादू की तरह काम किया। मुझे लगा कि ऐसा करने का एक तरीका होना चाहिए - अनुमान है कि मुझे फिर से प्रलेखन पढ़ना चाहिए कि आपने इसे समझाया है और देखें कि दस्तावेज़ एक ही बात कहें या नहीं। – Windle

+0

मेरी इच्छा है कि मैं इसे कई सारे +1 दे सकता हूं यह वही है जो मुझे चाहिए था, और अब मैं समझता हूं कि इसका अर्थ क्या है। – reidisaki

3

क्यों सिर्फ

private String getListAsJson(List<JsonEnabled> list) { ... } 

का उपयोग नहीं करते?

+3

ओपी कोड नमूने के आधार पर, आप उस फ़ंक्शन में 'सूची ' पैरामीटर को पास नहीं करते हैं। –

+1

@ लुइगी मैन्डोज़ा ने इसे दबाया। ऐसा लगता है कि अगर मैं सूची में प्रत्येक सूची को सूची में डालने की परेशानी से गुज़रने जा रहा हूं, तो मैं बस JSON भी कर सकता हूं। हालांकि मुझे वही विचार था। – Windle

+0

@ लुइगी मैन्डोज़ा मैं देखता हूं, धन्यवाद। ऐसा लगता है कि मैंने इस बिंदु को याद किया है। हालांकि आप अभी भी सूची बना सकते हैं और इसे उपयोगकर्ताओं के साथ भर सकते हैं और फिर इसे भी ऐसी विधि पास कर सकते हैं। –

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

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