आप जो करने की कोशिश कर रहे हैं वह बहुत उपयोगी है और मुझे लगता है कि मुझे इसे कोड में बहुत बार करने की आवश्यकता है जो मैं लिखता हूं। एक उदाहरण उपयोग मामला:
कहें कि हमारे पास एक इंटरफ़ेस है 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बयान पर उपयोग करने के लिए कोषेर नहीं है , यह एक असाइनमेंट पर इसका उपयोग करने के लिए स्पष्ट रूप से ठीक है, इसलिए अतिरिक्त "परिणाम" चर इस समस्या को हल करता है। (इसे कंपाइलर द्वारा या जेआईटी द्वारा वैसे भी अनुकूलित किया जाना चाहिए।)