ถ้าฉันจะบอกคุณโดยตรงว่ายาชื่อสามัญคืออะไร ฉันก็ทำไม่ได้จริงๆ นี่คือคำถาม:
กำหนดคลาสจุดพิกัดที่สามารถบันทึกข้อมูลประเภทต่างๆ ได้ เช่น จำนวนเต็ม ประเภทจุดทศนิยม และประเภทสตริง
เนื่องจากประเภทตัวแปรมีความไม่แน่นอนในตอนแรก จึงเป็นเรื่องง่ายที่จะนึกถึงการใช้คลาสพาเรนต์ของทุกประเภท ซึ่งก็คือคลาส Object แทน
ไม่มีเรื่องไร้สาระอีกต่อไป ใช้โค้ดเพื่อสะท้อนมัน
ตัวอย่างที่ 1: ใช้ Object เพื่อใช้อินพุตประเภทข้อมูลที่ไม่แน่นอน
//ใช้ Object เพื่อแสดงประเภทที่ไม่แน่นอน
จุดสาธารณะ (วัตถุ x, วัตถุ y) {
นี้.setX(x);
นี้.setY(y);
-
โมฆะสาธารณะ setX (วัตถุ x) {
นี่.x = x;
-
วัตถุสาธารณะ getX() {
กลับ x;
-
โมฆะสาธารณะ setY (วัตถุ y) {
นี่.y = y;
-
วัตถุสาธารณะ getY() {
กลับ y;
-
-
//คลาสทดสอบ
การสาธิตชั้นเรียนสาธารณะ {
โมฆะสาธารณะคงหลัก (สตริง [] args) {
System.out.println("ใช้ตัวเลขทศนิยมเพื่อแสดงพิกัด: ");
จุด p = จุดใหม่ (12.23,23.21);
//ในที่นี้คลาส Object จะถูกแปลงเป็นคลาส Double จากนั้นจะแกะกล่องออกโดยอัตโนมัติ
System.out.println("พิกัด X" + (Double)p.getX());
System.out.println("พิกัด Y" + (Double)p.getY());
System.out.println();
System.out.println("ใช้จำนวนเต็มเพื่อแสดงพิกัด: ");
จุด p2 = จุดใหม่ (12, 23);
System.out.println("พิกัดของ X" + (จำนวนเต็ม)p2.getX());
System.out.println("พิกัด Y" + (จำนวนเต็ม)p2.getY());
System.out.println();
System.out.println("แสดงพิกัดเป็นสตริง: ");
จุด p3 = จุดใหม่ ("ละติจูด 29 องศาเหนือ", "ลองจิจูด 113 องศาตะวันออก");
System.out.println("พิกัด X" + (String)p3.getX());
System.out.println("พิกัด Y" + (String)p3.getY());
-
-
คุณต้องเข้าใจให้ชัดเจนว่าคุณกำลังส่งผ่านประเภทใด จากนั้นจึงโยนลงก่อนจึงจะสามารถใช้งานได้
แม้ว่าสิ่งนี้จะเป็นไปตามความต้องการ แต่ก็บ่งบอกถึงปัจจัยที่ไม่ปลอดภัยด้วย เหตุใดจึงถูกกล่าวว่าเป็นนัย?
ตัวอย่างเช่น เราใช้จุดใหม่ (12.23, "ละติจูด 29 องศาเหนือ") เพื่อสร้างวัตถุ Point
แล้วใช้(ดับเบิ้ล)แปลงลงจะเกิดผลอย่างไร?
ใช่ การคอมไพล์จะผ่าน แต่เมื่อรันแล้ว ข้อยกเว้นในการแปลงประเภทจะเกิดขึ้น
นอกจากนี้ยังง่ายมากที่จะหลีกเลี่ยงข้อยกเว้นในการแปลงคลาส เพียงแทนที่การประกาศ Object ด้วยการประกาศประเภทคงที่ (เช่น: String x, String y) เพื่อให้มีการรายงานข้อผิดพลาดระหว่างการคอมไพล์
จากนั้นคุณจะพบข้อผิดพลาดและทำการแก้ไข
แต่แล้วเราก็ไม่สามารถสนองความต้องการได้
เพื่อหลีกเลี่ยงความเสี่ยงด้านความปลอดภัยและทดแทนข้อมูลประเภทต่างๆ ผู้มีความสามารถเหล่านั้นได้แนะนำแนวคิดเรื่องยาสามัญใน JDK1.5
เรามาดูวิธีการเขียนโค้ดด้านบนใหม่โดยใช้ข้อมูลทั่วไป
ตัวอย่างที่ 2: คลาสทั่วไป
การสาธิตชั้นเรียนสาธารณะ {
โมฆะสาธารณะคงหลัก (สตริง [] args) {
System.out.println("ใช้ตัวเลขทศนิยมเพื่อแสดงพิกัด: ");
//หลังจากเขียนใหม่ด้วยข้อมูลทั่วไปแล้ว ไม่จำเป็นต้องแปลงข้อมูลที่ใช้ลง
จุด<สองเท่า> p = จุดใหม่<สองเท่า>(12.23,23.21);
System.out.println("พิกัด X" + p.getX());
System.out.println("พิกัด Y" + p.getY());
System.out.println();
System.out.println("ใช้จำนวนเต็มเพื่อแสดงพิกัด: ");
จุด<จำนวนเต็ม> p2 = จุดใหม่<จำนวนเต็ม>(12, 23);
System.out.println("พิกัด X" + p2.getX());
System.out.println("พิกัด Y" + p2.getY());
System.out.println();
System.out.println("แสดงพิกัดเป็นสตริง: ");
จุด<String> p3 = จุดใหม่<String>("ละติจูด 29 องศาเหนือ", "ลองจิจูด 113 องศาตะวันออก");
System.out.println("พิกัด X" + p3.getX());
System.out.println("พิกัด Y" + p3.getY());
-
-
หากเราจงใจส่งต่อข้อมูลประเภทต่างๆ ในเวลานี้:
จุด<Double> p = จุดใหม่<Double>("ละติจูด 29 องศาเหนือ",12.22);
จากนั้นจะรายงานข้อผิดพลาดระหว่างการคอมไพล์
แม้ว่าข้อมูลทั่วไปจะถูกกำหนดไว้ แต่ถ้าคุณไม่ได้ใช้กลไกทั่วไปในตัวสร้าง ก็จะถือว่าข้อมูลเป็นวัตถุ
จุดประสงค์หลักคือเพื่อให้เข้ากันได้กับโค้ดเก่าก่อน JDK1.4 เช่น
จุด p = จุดใหม่ (22.11,23.21);
ผลลัพธ์การทำงานขั้นสุดท้ายจะเหมือนกัน แต่จะมีข้อความเตือนปรากฏขึ้นระหว่างการคอมไพล์
ตัวอย่างที่ 3: วิธีการทั่วไป
ดังที่คุณเห็นจากตัวอย่างข้างต้น เมื่อระบุประเภทอ็อบเจ็กต์ใน Constructor แล้ว ประเภทเดียวกันนี้จะถูกใช้ในทั้งคลาส
ตัวอย่างทั่วไปส่วนใหญ่จะใช้ในกรอบงานการรวบรวม เช่น: ArrayList<Integer> al = new ArrayList<Integer>();
ในขณะนี้ อ็อบเจ็กต์ทุกประเภทที่ทำงานใน al จะเป็น Integer
อย่างไรก็ตาม บางครั้งเราไม่ต้องการแก้ไขวัตถุประสงค์ของการดำเนินงาน แต่ต้องการใช้เทคโนโลยีทั่วไปที่มีความยืดหยุ่นมากขึ้น
ในเวลานี้ คุณสามารถลองใช้วิธีทั่วไปได้
สาธารณะ <E> แสดงเป็นโมฆะ (E e) {
System.out.println(e);
-
-
การสาธิตชั้นเรียนสาธารณะ {
โมฆะสาธารณะคงหลัก (สตริง [] args) {
พิมพ์ p = พิมพ์ใหม่ ();
หน้าพิมพ์(12);
p.print("สวัสดี");
p.show(จำนวนเต็มใหม่(33));
หน้าแสดง(23);
-
-
ในความเป็นจริง ด้วยวิธีนี้ ไม่มีความแตกต่างอย่างมากจากการใช้วัตถุ Object ในวิธีการ
ยิ่งไปกว่านั้น หลังจาก JDK1.5 แล้ว ฟังก์ชันแกะกล่องอัตโนมัติก็ถูกเพิ่มเข้ามา ทำให้ไม่จำเป็นต้องเปลี่ยนรูปลง
ตัวอย่างที่ 4: อินเทอร์เฟซทั่วไป
// การดำเนินการวิธีการหนึ่ง:
คลาส InterDemo1 ใช้ Inter<String> {
การพิมพ์โมฆะสาธารณะ (สตริง t) {
System.out.println("พิมพ์: " + t);
-
-
// วิธีการนำไปใช้งานที่สอง:
คลาส InterDemo2<T> ใช้ Inter<T> {
การพิมพ์โมฆะสาธารณะ (T t) {
System.out.println("พิมพ์: " + t);
-
-
การสาธิตคลาส {
โมฆะสาธารณะคงหลัก (สตริง [] args) {
InterDemo1 id1 = InterDemo1 ใหม่();
id1.print("สวัสดี");
InterDemo2<จำนวนเต็ม> id2 = ใหม่ InterDemo2<จำนวนเต็ม>();
id2.print (จำนวนเต็มใหม่ (23));
-
-
มีสองวิธีในการใช้อินเทอร์เฟซทั่วไป วิธีแรกคือระบุประเภททั่วไปเมื่อใช้งาน
อีกประการหนึ่งคือยังคงใช้ยาชื่อสามัญและกำหนดประเภทยาสามัญในระหว่างการก่อสร้าง