สิ่งที่คุณพยายามทำมีประโยชน์มากและฉันพบว่าฉันต้องทำบ่อยๆในโค้ดที่ฉันเขียน ตัวอย่างการใช้งาน:
บอกว่าเรามีอินเตอร์เฟซFoo
และเรามีzorking
แพคเกจที่มีที่สร้างและจัดการกรณีของแพคเกจและเอกชนZorkingFooManager
ZorkingFoo implements Foo
(สถานการณ์ที่พบบ่อยมาก)
ดังนั้นZorkingFooManager
จำเป็นต้องมีprivate Collection<ZorkingFoo> zorkingFoos
แต่ต้องแสดงไฟล์public Collection<Foo> getAllFoos()
.
โปรแกรมเมอร์ java ส่วนใหญ่จะไม่คิดซ้ำสองก่อนที่จะใช้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
คำสั่ง แต่ก็เห็นได้ชัดว่าสามารถใช้กับงานมอบหมายได้ดังนั้นตัวแปร "ผลลัพธ์" พิเศษจะช่วยแก้ปัญหานี้ได้ (ควรปรับให้เหมาะสมที่สุดไม่ว่าจะโดยคอมไพเลอร์หรือโดย JIT ก็ตาม)