Java Generics (Generics) เป็นคุณสมบัติใหม่ที่นำมาใช้ใน JDK5 ที่อนุญาตให้ใช้พารามิเตอร์ประเภท (พารามิเตอร์ประเภท) เมื่อกำหนดคลาสและอินเทอร์เฟซ พารามิเตอร์ประเภทที่ประกาศจะถูกแทนที่ด้วยประเภทเฉพาะเมื่อใช้ แอปพลิเคชันยาสามัญที่สำคัญที่สุดในขณะนี้อยู่ในเฟรมเวิร์กคลาสคอลเลกชันใหม่ใน JDK5 ซึ่งใช้แผนที่และรายการ ข้อดีนั้นชัดเจนในตัวเอง เราสามารถขยายคลาสในแนวนอนได้มากขึ้น ข้อเสียคือข้อดีของมันจริงๆ เพราะเมื่อเราใช้คลาสทั่วไป เราจะต้องชัดเจนมากเกี่ยวกับวัตถุประสงค์ของโค้ดของเรา และไม่สามารถใช้ประเภทข้อผิดพลาดได้
คลาสทั่วไปขั้นพื้นฐานที่สุด
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e1;
-
* คลาสทั่วไปขั้นพื้นฐานที่สุด ประเภทจะกำหนดด้วยตัวเอง
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
จุดคลาสสาธารณะ<T> {
T ส่วนตัว var;
สาธารณะ T getVar () {
กลับ var;
-
โมฆะสาธารณะ setVar (T var) {
this.var = var;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e1;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
จุด<String> p = จุดใหม่<String> ();
p.setVar("ตัวเข้ารหัส");
System.out.println(p.getVar());
-
-
หลายประเภททั่วไป
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e2;
-
* หลายประเภททั่วไป โดยทั่วไป ควรใช้ตัวอักษรที่ใกล้กับ T เช่น S, R เป็นต้น
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
* @พาราม <S>
-
Notepad คลาสสาธารณะ<T, S> {
รหัส T ส่วนตัว
ค่า S ส่วนตัว
สาธารณะ T getKey () {
ส่งคืน this.key;
-
สาธารณะ S getValue () {
ส่งคืน this.value;
-
setKey โมฆะสาธารณะ (คีย์ T) {
this.key = คีย์;
-
โมฆะสาธารณะ setValue (ค่า S) {
this.value = ค่า;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e2;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
Notepad<String, Integer> p = Notepad ใหม่<String, Integer> ();
p.setKey("ตัวเข้ารหัส");
p.setValue(99999);
System.out.println("คีย์: " + p.getKey());
System.out.println("value: " + p.getValue());
-
-
ใช้ไวด์การ์ด "?" ในพารามิเตอร์วิธีการ
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e3;
-
* กุญแจสำคัญของตัวอย่างนี้อยู่ในวิธีการหลัก
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลชั้นเรียนสาธารณะ <T> {
รหัส T ส่วนตัว
สาธารณะ T getKey () {
ส่งคืน this.key;
-
setKey โมฆะสาธารณะ (คีย์ T) {
this.key = คีย์;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.key.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e3;
-
* ใช้ไวด์การ์ดในพารามิเตอร์วิธีการ
* @ผู้เขียน การิน จาง
-
-
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล<String> i = ข้อมูลใหม่<String>();
i.setKey("ตัวเข้ารหัส");
สนุก(ฉัน);
ข้อมูล <จำนวนเต็ม> j = ข้อมูลใหม่ <จำนวนเต็ม>();
เจ. setKey (9999);
สนุก(เจ);
-
ความสนุกโมฆะสาธารณะแบบคงที่ (ข้อมูล <?> อุณหภูมิ) {
System.out.println("เนื้อหา: " + อุณหภูมิ);
-
-
การเปลี่ยนแปลงที่สูงขึ้นล้มเหลว
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e4;
-
* กุญแจสำคัญของตัวอย่างนี้อยู่ในวิธีการหลัก
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลชั้นเรียนสาธารณะ <T> {
รหัส T ส่วนตัว
สาธารณะ T getKey () {
ส่งคืน this.key;
-
setKey โมฆะสาธารณะ (คีย์ T) {
this.key = คีย์;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.key.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e4;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล <String> strEg = ข้อมูลใหม่ <String>();
ข้อมูล <วัตถุ> objEg;
// ข้อผิดพลาดในการรวบรวม "ประเภทไม่ตรงกัน: ไม่สามารถแปลงจากข้อมูล <String> เป็นข้อมูล <Object>"
//Upcast ล้มเหลว สตริง -> วัตถุ
// objEg = strEg;
-
-
การใช้ชื่อสามัญในอินเทอร์เฟซ
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e5;
-
* กุญแจสำคัญของตัวอย่างนี้อยู่ในวิธีการหลัก
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลอินเทอร์เฟซ <T> {
สาธารณะ T getVar();
-
แพ็คเกจ com.garinzhang.javabase.generic.e5;
-
* ชั้นเรียนทั่วไป
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
InfoImpl<T> ระดับสาธารณะใช้ข้อมูล <T> {
T ส่วนตัว var;
InfoImpl สาธารณะ (T var) {
this.setVar(var);
-
โมฆะสาธารณะ setVar (T var) {
this.var = var;
-
สาธารณะ T getVar () {
กลับ this.var;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e5;
-
* ชั้นเรียนที่ไม่ทั่วไป
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
InfoImpl1 คลาสสาธารณะใช้ข้อมูล <String> {
สตริงส่วนตัว var;
InfoImpl1 สาธารณะ (สตริง var) {
this.setVar(var);
-
โมฆะสาธารณะ setVar (String var) {
this.var = var;
-
สตริงสาธารณะ getVar() {
กลับ this.var;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e5;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล<String> strEg = ใหม่ InfoImpl<String>("coder");
System.out.println("เนื้อหา: " + strEg.getVar());
ข้อมูล<String> strEg1 = ใหม่ InfoImpl1("coder1");
System.out.println("เนื้อหา: " + strEg1.getVar());
-
-
สัญลักษณ์ตัวแทนและการใช้ส่วนขยายและซุปเปอร์
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e6;
-
* กุญแจสำคัญของตัวอย่างนี้อยู่ในวิธีการหลัก
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลชั้นเรียนสาธารณะ <T> {
รหัส T ส่วนตัว
สาธารณะ T getKey () {
ส่งคืน this.key;
-
setKey โมฆะสาธารณะ (คีย์ T) {
this.key = คีย์;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.key.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e6;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล <String> strEg = ข้อมูลใหม่ <String>();
strEg.setKey("ตัวเข้ารหัส");
// ข้อผิดพลาดในการรวบรวม "วิธีการสนุก (ข้อมูล <? ขยายหมายเลข>) ในประเภท GenericExample ไม่สามารถใช้ได้กับอาร์กิวเมนต์ (ข้อมูล <สตริง>)"
// upTypeLimit(i);
// ใช้ประเภทจำนวนเต็มหรือตัวเลข
ข้อมูล<จำนวนเต็ม> intEg = ข้อมูลใหม่<จำนวนเต็ม>();
intEg.setKey(9999);
upTypeLimit(intEg);
// ข้อผิดพลาดในการรวบรวม "วิธีการ downTypeLimit (ข้อมูล <? super String>) ในประเภท GenericExample ไม่สามารถใช้ได้กับอาร์กิวเมนต์ (ข้อมูล <Integer>)"
// downTypeLimit(intEg);
// เนื่องจากมีการใช้ super downTypeLimit จึงสามารถรับได้เฉพาะ String และ Object เท่านั้น
// ตรวจสอบความสัมพันธ์การสืบทอดของ String ไม่มีการสืบทอดคลาสอื่น มีเพียง Object เท่านั้น
downTypeLimit(strEg);
ข้อมูล <Object> objEg = ข้อมูลใหม่ <Object>();
objEg.setKey(999);
downTypeLimit(objEg);
-
-
* <? ขยาย T> แสดงถึงขอบเขตบนของประเภท ซึ่งบ่งชี้ว่าประเภทที่กำหนดพารามิเตอร์อาจเป็น T หรือคลาสย่อยของ T
* @พารามิเตอร์อุณหภูมิ
-
โมฆะสาธารณะคงที่ upTypeLimit (ข้อมูล <? ขยายหมายเลข> ชั่วคราว) {
System.out.println("เนื้อหา: " + อุณหภูมิ);
-
-
* <? super T> แสดงถึงขอบเขตล่างของประเภท (เรียกว่าคุณสมบัติประเภทซุปเปอร์ใน Java Core) ซึ่งบ่งชี้ว่าประเภทที่กำหนดพารามิเตอร์เป็นประเภทซุปเปอร์ (ประเภทพาเรนต์) ของประเภทนี้ จนกระทั่ง Object
* ในตัวอย่างนี้ หมายความว่า T สามารถเป็นได้เฉพาะ Object หรือ String เท่านั้น เนื่องจาก String สืบทอดมาจาก Object เท่านั้น
* @พารามิเตอร์อุณหภูมิ
-
โมฆะสาธารณะคงที่ downTypeLimit (ข้อมูล <? super String> ชั่วคราว) {
System.out.println("เนื้อหา: " + อุณหภูมิ);
-
-
ข้อมูลทั่วไปของวิธีการ, ข้อมูลทั่วไปหลายรายการในวิธีการ
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e7;
-
* ข้อมูลทั่วไปของวิธีการ, ข้อมูลทั่วไปหลายรายการในวิธีการ
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลชั้นเรียนสาธารณะ {
-
* รูปแบบ: การปรับเปลี่ยนวิธีการ <รายการประเภทที่คั่นด้วยเครื่องหมายจุลภาค> ชื่อวิธีการประเภทค่าส่งคืน (รายการพารามิเตอร์)
* ตัวอย่างเช่น: สาธารณะ <T, S> T สนุก(T t, S s)
* @param ต
* @param ส
* @กลับ
-
สาธารณะ <T, S> T สนุก(T t, S s) {
System.out.println(s.toString());
กลับที;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e7;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูลข้อมูล = ข้อมูลใหม่ ();
String str = info.fun("coder", "พิมพ์พารามิเตอร์ทั่วไปที่สอง");
System.out.println(str);
int i = info.fun(30, "พิมพ์พารามิเตอร์ที่สองอีกครั้ง");
System.out.println(i);
-
-
ประเภททั่วไปที่ส่งผ่านหรือส่งคืนในเมธอดจะถูกกำหนดโดยประเภทพารามิเตอร์ที่ตั้งค่าไว้เมื่อมีการเรียกใช้เมธอด
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e8;
-
* ขยาย
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลคลาสสาธารณะ <T ขยายหมายเลข> {
T ส่วนตัว var;
สาธารณะ T getVar () {
กลับ this.var;
-
โมฆะสาธารณะ setVar (T var) {
this.var = var;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.var.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e8;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล<Integer> intEg = fun(30); // ประเภทที่นี่ถูกกำหนดให้เป็นจำนวนเต็ม
System.out.println(intEg.getVar());
-
-
* ประเภททั่วไปที่ส่งผ่านหรือส่งคืนในเมธอดจะถูกกำหนดโดยประเภทพารามิเตอร์ที่ตั้งค่าไว้เมื่อเรียกใช้เมธอด
* @พาราม พาราม
* @กลับ
-
สาธารณะ <T ขยายหมายเลข> ข้อมูล <T> สนุก (พารามิเตอร์ T) {
ข้อมูล <T> temp = ข้อมูลใหม่ <T>();
temp.setVar(พารามิเตอร์);
อุณหภูมิกลับ;
-
-
ทำให้พารามิเตอร์ทั้งสองประเภทส่งผ่านในวิธีการที่สอดคล้องกัน
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e9;
-
* ดูหลัก
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลชั้นเรียนสาธารณะ<T> {
T ส่วนตัว var;
สาธารณะ T getVar () {
กลับ this.var;
-
โมฆะสาธารณะ setVar (T var) {
this.var = var;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.var.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e9;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
ข้อมูล <String> i1 = ข้อมูลใหม่ <String>();
i1.setVar("สวัสดี");
ข้อมูล <String> i2 = ข้อมูลใหม่ <String>();
i2.setVar("โค้ดเดอร์");
ข้อมูล <จำนวนเต็ม> i3 = ข้อมูลใหม่ <จำนวนเต็ม>();
i3.setVar(999);
เพิ่ม(i1, i2);
// ข้อผิดพลาดในการรวบรวม "วิธีการเพิ่ม (ข้อมูล <T>, ข้อมูล <T>) ในประเภท GenericExample ไม่สามารถใช้ได้กับอาร์กิวเมนต์ (ข้อมูล <String>, ข้อมูล <Integer>)"
// เพิ่ม(i1, i3);
-
-
* พารามิเตอร์ทั้งสองประเภทที่ส่งผ่านวิธีการจะต้องสอดคล้องกัน
* @พาราม พาราม
* @กลับ
-
สาธารณะคงที่ <T> เพิ่มเป็นโมฆะ (ข้อมูล <T> i1, ข้อมูล <T> i2) {
System.out.println(i1.getVar() + /// + i2.getVar());
-
-
ข้อมูลทั่วไป พารามิเตอร์ตัวแปร คล้ายกับวัตถุอาร์กิวเมนต์ใน JavaScript
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e10;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
จำนวนเต็ม i[] = สนุก(1, 2, 3, 4, 5, 6);
สนุก2(i);
-
สาธารณะคงที่ <T> T[] สนุก (T... arg) {
กลับหาเรื่อง;
-
สาธารณะคง <T> เป็นโมฆะ fun2 (T พารามิเตอร์ []) {
System.out.println("อาร์เรย์ทั่วไป: ");
สำหรับ(T t : พารามิเตอร์) {
System.out.println(t + " ,");
-
-
-
การซ้อนทั่วไป: ใช้คลาสทั่วไปเป็นพารามิเตอร์ กำหนดค่าที่ส่งคืนตามประเภทค่าที่ส่งคืน
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.garinzhang.javabase.generic.e11;
-
* ยอมรับสองประเภททั่วไป
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
ข้อมูลคลาสสาธารณะ<T, V> {
T ส่วนตัว var;
ค่า V ส่วนตัว
สาธารณะ T getVar () {
กลับ this.var;
-
โมฆะสาธารณะ setVar (T var) {
this.var = var;
-
สาธารณะ V getValue () {
ส่งคืน this.value;
-
setValue โมฆะสาธารณะ (ค่า V) {
this.value = ค่า;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ this.var.toString();
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e11;
-
* รับ 1 ประเภททั่วไป
* @ผู้เขียน การิน จาง
-
* @พาราม <T>
-
การสาธิตคลาสสาธารณะ <S> {
ข้อมูล S ส่วนตัว;
การสาธิตสาธารณะ (ข้อมูล) {
this.setInfo(ข้อมูล);
-
โมฆะสาธารณะ setInfo (ข้อมูล) {
this.info = ข้อมูล;
-
สาธารณะ S getInfo () {
ส่งคืน this.info;
-
-
แพ็คเกจ com.garinzhang.javabase.generic.e11;
นำเข้า java.util.List;
นำเข้า com.google.common.collect.Lists;
GenericExample ระดับสาธารณะ {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
สาธิต <ข้อมูล <สตริง, จำนวนเต็ม>> d;
ข้อมูล <สตริง, จำนวนเต็ม> i;
i = ข้อมูลใหม่ <String, Integer>();
i.setVar("โค้ดเดอร์");
i.setValue(999);
d = การสาธิตใหม่<ข้อมูล<สตริง,จำนวนเต็ม>>(i);
System.out.println("เนื้อหา: " + d.getInfo().getVar());
System.out.println("เนื้อหา: " + d.getInfo().getValue());
System.out.println(แบบสอบถาม (1, 2, 3, 4, 5).toString()); // [1, 2, 3, 4, 5]
// คำเตือน "ความปลอดภัยของประเภท: อาร์เรย์ทั่วไปของ Object&Comparable<?>&Serializable ถูกสร้างขึ้นสำหรับพารามิเตอร์ varargs"
System.out.println(query(1, 2, 3, "StringType").toString()); // [1, 2, 3, StringType]
System.out.println(query("I ", "am ", "a ", "coder").toString());// [I , am , a , coder]
รายการ<String> list = Lists.newArrayList("I ", "am ", "a ", "coder");
System.out.println(list.toString()); // [I , am , a , coder]
-
-
* กำหนดประเภททั่วไปผ่านค่าตอบแทน ประเภทค่าตอบแทนในวิธีนี้จะถูกสร้างขึ้นโดยอัตโนมัติตามคำจำกัดความของวิธีการ
* องค์ประกอบ @param
* @กลับ
-
แบบสอบถาม <E> รายการ <E> สาธารณะแบบคงที่ (องค์ประกอบ E...) {
// https://github.com/exitsoft/exit-web-framework/commit/1d2f1098a2a4b6abab175b793e2308aa8bd0ea16.
//นำเข้า com.google.common.collect.Lists;
// <การพึ่งพา>
// <groupId>com.google.guava</groupId>
// <artifactId>ฝรั่ง</artifactId>
// <version>16.0.1</version>
// </การพึ่งพา>
กลับ Lists.newArrayList (องค์ประกอบ);
-
-