आप जो करने की कोशिश कर रहे हैं वह बहुत उपयोगी है और मुझे लगता है कि मुझे इसे कोड में बहुत बार करने की आवश्यकता है जो मैं लिखता हूं। एक उदाहरण उपयोग मामला:
कहें कि हमारे पास एक इंटरफ़ेस है Foo
और हमारे पास एक zorking
पैकेज है जिसमें एक पैकेज ZorkingFooManager
है और पैकेज-प्राइवेट के उदाहरणों का प्रबंधन करता है ZorkingFoo implements Foo
। (एक बहुत ही सामान्य परिदृश्य।)
तो, ZorkingFooManager
एक को शामिल करने की जरूरत है private Collection<ZorkingFoo> zorkingFoos
लेकिन यह एक को बेनकाब करने की जरूरत है public Collection<Foo> getAllFoos()
।
अधिकांश जावा प्रोग्रामर getAllFoos()
एक नए आवंटन के रूप में लागू करने से पहले दो बार नहीं सोचेंगे ArrayList<Foo>
, इसे सभी तत्वों के साथ आबादी देंगे zorkingFoos
और इसे वापस करेंगे। मुझे लगा कि मनोरंजन का आनंद ले रहे हैं, पूरे ग्रह पर लाखों मशीनों पर चलने वाले जावा कोड द्वारा उपभोग किए जाने वाले सभी घड़ी चक्रों का लगभग 30% कुछ भी नहीं कर रहा है, लेकिन ArrayLists की ऐसी बेकार प्रतियां बना रहा है जो उनके निर्माण के बाद कचरा एकत्र किए गए माइक्रोसेकंड हैं।
इस समस्या का समाधान, निश्चित रूप से, संग्रह को डाउन-कास्टिंग करना है। यहाँ यह करने का सबसे अच्छा तरीका है:
static <T,U extends T> List<T> downCastList( List<U> list )
{
return castList( list );
}
जो हमें castList()
फंक्शन में लाता है :
static <T,E> List<T> castList( List<E> list )
{
@SuppressWarnings( "unchecked" )
List<T> result = (List<T>)list;
return result;
}
result
जावा भाषा के विकृत होने के कारण मध्यवर्ती चर आवश्यक है:
इसलिए, भले ही यह @SuppressWarnings
एक return
बयान पर उपयोग करने के लिए कोषेर नहीं है , यह एक असाइनमेंट पर इसका उपयोग करने के लिए स्पष्ट रूप से ठीक है, इसलिए अतिरिक्त "परिणाम" चर इस समस्या को हल करता है। (इसे कंपाइलर द्वारा या जेआईटी द्वारा वैसे भी अनुकूलित किया जाना चाहिए।)