ຄອມພິວເຕີ້Programming

Java Generics: ລາຍລະອຽດແລະວິທີການ

ນັບຕັ້ງແຕ່ການເລີ່ມຕົ້ນຂອງຕົນ, ພາສາ Java ໄດ້ມີການປ່ຽນແປງຫຼາຍ, ເຊິ່ງ, undoubtedly, ໄດ້ນໍາເອົາລັກສະນະໃນທາງບວກກັບການທໍາງານຂອງຕົນ. ຫນຶ່ງໃນການປ່ຽນແປງທີ່ສໍາຄັນຄືການນໍາໃຊ້ Java Generic ຫຼື generalization. ຟັງຊັນນີ້ເຮັດໃຫ້ພາສາບໍ່ພຽງແຕ່ມີຄວາມຍືດຫຍຸ່ນແລະມີປະໂຍດ, ແຕ່ຍັງມີຄວາມປອດໄພຫລາຍຂຶ້ນໃນການຫຼຸດຜ່ອນປະເພດຂໍ້ມູນ.

ຄວາມຈິງແລ້ວແມ່ນວ່າກ່ອນການນໍາໃຊ້ generics, ລະຫັດທົ່ວໄປໃນ Java ສາມາດສ້າງໄດ້, ມີພຽງແຕ່ມີການເຊື່ອມຕໍ່ຂອງ Object object. ການເຊື່ອມຕໍ່ດັ່ງກ່າວສາມາດຖືກມອບຫມາຍໃຫ້ກັບຈຸດປະສົງໃດຫນຶ່ງ. ຫຼັງຈາກທັງຫມົດ, ທຸກຊັ້ນຮຽນໃນ Java ແມ່ນ descendants implicit ຂອງ class Object. ຢ່າງໃດກໍຕາມ, ວິທີການນີ້ແມ່ນແຫຼ່ງທີ່ເປັນໄປໄດ້ຂອງຄວາມຜິດພາດຄວາມປອດໄພປະເພດຈໍານວນຫຼາຍເມື່ອທ່ານອະທິບາຍຢ່າງຊັດເຈນການປ່ຽນວັດຖຸຈາກຈຸດປະສົງກັບປະເພດເປົ້າຫມາຍ. ໃນເວລາທີ່ generalizations ຖືກນໍາໃຊ້, ທັງຫມົດ casts ແມ່ນປະຕິບັດ implicitly ແລະອັດຕະໂນມັດ, ເຊິ່ງ excludes ເຖິງແມ່ນວ່າຄວາມເປັນໄປໄດ້ຂອງຄວາມຜິດພາດ.

Java Generics: ຄໍາອະທິບາຍແລະຕົວຢ່າງ

ໃຫ້ພວກເຮົາພິຈາລະນາຕົວຢ່າງທີ່ງ່າຍດາຍກ່ຽວກັບການນໍາໃຊ້ທົ່ວໄປໄປຫາຫ້ອງຮຽນປົກກະຕິໃນຮູບຂ້າງລຸ່ມນີ້. ແລະພຽງແຕ່ຫຼັງຈາກນັ້ນພວກເຮົາຈະສືບຕໍ່ການກວດສອບລະອຽດຂອງ subtleties ທັງຫມົດແລະ nuances ຂອງ Java Generic.

ສັງເກດວິທີການຮຽນ Pair ຖືກປະກາດວ່າ. ຫຼັງຈາກຊື່ຂອງຫ້ອງຮຽນ, ວົງເລີ້ມມຸມແມ່ນເປີດ, ທີ່ຕົວອັກສອນ T ຖືກສະແດງ. ມັນເປັນຊະນິດທີ່ບ່ອນທີ່ຈະຖືກແທນທີ່ດ້ວຍປະເພດສະເພາະເມື່ອສ້າງຕົວຢ່າງຂອງຊັ້ນນີ້. ມັນຄ້າຍຄືນີ້: Pair obj = new Pair (). ມັນຄວນຈະສັງເກດວ່າແທນທີ່ຈະ T, ທ່ານສາມາດກໍານົດຕົວອັກສອນໃດໆ, ແຕ່, ຕາມກົດ, ໃຊ້ T, V ຫຼື E.

ຫມາຍເຫດ: ເລີ່ມຕົ້ນດ້ວຍ Java version eighth, ກໍານົດປະເພດເປົ້າຫມາຍໃນເວລາທີ່ເຊື່ອມໂຍງຈະຖືກປະກາດ, ທ່ານສາມາດປ່ອຍວົງເລັບມຸມໃນ constructor ຫວ່າງເປົ່າ. ດັ່ງນັ້ນຕົວຢ່າງຂ້າງຕົ້ນສາມາດຂຽນຄືນໃຫມ່ດັ່ງຕໍ່ໄປນີ້: Pair obj = new Pair <> ().

ໃນເວລາທີ່ຫ້ອງຮຽນໄດ້ຖືກປະກາດທາງນີ້, ຫຼັງຈາກນັ້ນໃນຮ່າງກາຍນີ້, ແທນທີ່ຈະປະເພດຂອງທົ່ງນາ, ການອ້າງອິງແລະວິທີການທີ່ສົ່ງຄືນໂດຍວິທີການ, ທ່ານສາມາດໃຊ້ຕົວອັກສອນນີ້. ເນື່ອງຈາກວ່າ T ຖືກແທນທີ່ດ້ວຍປະເພດສະເພາະເມື່ອສ້າງວັດຖຸຊັ້ນ, ທົ່ງທໍາອິດແລະທີສອງໃນກໍລະນີນີ້ຈະເປັນປະເພດ Integer.

ການປະຕິບັດຕາມເຫດຜົນ, ການໂຕ້ຖຽງ firstItem ແລະ secondItem, ສົ່ງໄປຫາຕົວສ້າງທີ່ສອດຄ້ອງກັນ, ຍັງຕ້ອງເປັນປະເພດ Integer ຫຼືລະບົບຍ່ອຍຂອງມັນ. ຖ້າທ່ານພະຍາຍາມຖ່າຍທອດຂໍ້ມູນທີ່ແຕກຕ່າງຈາກສິ່ງທີ່ໄດ້ກໍານົດໄວ້ໃນເວລາທີ່ຈຸດປະສົງຖືກສ້າງ, compiler ຈະບໍ່ຂ້າມຂໍ້ຜິດພາດນີ້. ດັ່ງນັ້ນ, ຜູ້ສ້າງທີ່ມີການໂຕ້ຖຽງໃນເວລາທີ່ການສ້າງວັດຖຸຈະມີຮູບແບບດັ່ງຕໍ່ໄປນີ້: ຄູ່ obj = new pair <> (new integer (1), new Integer (2)). ຄືກັນກັບການໂຕ້ຖຽງກັບວິທີ setFirst ແລະ setSecond. ແລະດັ່ງທີ່ທ່ານອາດຈະຄາດເດົາແລ້ວ, ວິທີການ getFirst ແລະ getSecond ຈະສົ່ງຄືນມູນຄ່າຂອງຊະນິດ Integer.

ຊັ້ນຮຽນທົ່ວໄປທີ່ມີພາລາມິເຕີປະເພດຈໍານວນຫນຶ່ງ

ໃນຊັ້ນຮຽນທົ່ວໄປ, ທ່ານຍັງສາມາດປະກາດຕົວກໍານົດການປະເພດຈໍານວນຫນຶ່ງທີ່ຖືກກໍານົດໄວ້ໃນວົງເລີ້ມມຸມ, ແຍກໂດຍໂຄຣມ. ຊັ້ນຮຽນຄູ່ສໍາລັບກໍລະນີນີ້ແມ່ນສະແດງຢູ່ໃນຮູບຂ້າງລຸ່ມນີ້.

ເມື່ອທ່ານສາມາດເບິ່ງເຫັນໄດ້, ເມື່ອສ້າງຕົວຢ່າງຂອງຫ້ອງດັ່ງກ່າວ, ຈໍານວນປະເພດດຽວກັນກັບພາລາມິຕິຄວນຈະຖືກກໍານົດໄວ້ໃນວົງເລີ້ມມຸມ. ຖ້າທ່ານຄຸ້ນເຄີຍກັບໂຄງສ້າງຂໍ້ມູນດັ່ງກ່າວເຊັ່ນແຜນທີ່, ຫຼັງຈາກນັ້ນທ່ານອາດສັງເກດເຫັນວ່າຫຼັກການດຽວກັນຖືກນໍາໃຊ້ຢູ່ທີ່ນັ້ນ. ມີ, ການໂຕ້ຖຽງຄັ້ງທໍາອິດກໍານົດຊະນິດຂອງຄີ, ແລະຄັ້ງທີສອງກໍານົດປະເພດຂອງມູນຄ່າ. ມັນຄວນຈະສັງເກດວ່າປະເພດຂອງການໂຕ້ຖຽງຜ່ານການສ້າງວັດຖຸສາມາດຄືກັນ. ດັ່ງນັ້ນ, ການປະກາດດັ່ງຕໍ່ໄປນີ້ຂອງຕົວຢ່າງຂອງຫ້ອງຄູ່ແມ່ນແທ້ໆຖືກຕ້ອງ: ຄູ່ obj.

ບາງລັກສະນະຂອງການທົ່ວໄປ

ກ່ອນທີ່ຈະດໍາເນີນການຕໍ່ໄປ, ຄວນສັງເກດວ່າຕົວປະກອບ Java ບໍ່ໄດ້ສ້າງລຸ້ນອື່ນໆຂອງຊັ້ນ Pair. ໃນຄວາມເປັນຈິງ, ໃນຂະບວນການລວບລວມ, ຂໍ້ມູນທັງຫມົດກ່ຽວກັບປະເພດທົ່ວໄປຈະຖືກລຶບອອກ. ແທນທີ່ຈະ, ປະເພດທີ່ສອດຄ້ອງກັນແມ່ນການໂຍນ, ການສ້າງສະບັບພິເສດຂອງຊັ້ນ Pair. ຢ່າງໃດກໍຕາມ, ໂຄງການຕົວມັນເອງຍັງມີສະບັບທົ່ວໄປດຽວຂອງຫ້ອງຮຽນນີ້. ຂະບວນການນີ້ຖືກເອີ້ນໃນການທໍາຄວາມສະອາດແບບ Java Generic.

ໃຫ້ສັງເກດເປັນຈຸດທີ່ສໍາຄັນ. ການເຊື່ອມໂຍງກັບສະບັບທີ່ແຕກຕ່າງກັນຂອງກຸ່ມ java ທົ່ວໄປດຽວກັນບໍ່ສາມາດຈຸດຫາວັດຖຸດຽວກັນ. ນັ້ນແມ່ນ, ໃຫ້ເວົ້າວ່າພວກເຮົາມີສອງລິງ: ຄູ່ obj1 ແລະ Pair obj2. ດັ່ງນັ້ນຂໍ້ຜິດພາດເກີດຂື້ນໃນເສັ້ນ obj1 = obj2. ເຖິງແມ່ນວ່າທັງສອງຕົວແປແມ່ນປະເພດ Pair , ວັດຖຸທີ່ພວກເຂົາອ້າງເຖິງແມ່ນແຕກຕ່າງກັນ. ນີ້ແມ່ນຕົວຢ່າງທີ່ສົດໃສຂອງຄວາມປອດໄພຂອງປະເພດໃນ Java Generic.

ການຈໍາກັດ imposed ໃນຫ້ອງຮຽນທົ່ວໄປ

ມັນເປັນສິ່ງສໍາຄັນທີ່ຈະຮູ້ວ່າ generalizations ສາມາດຖືກນໍາໃຊ້ກັບປະເພດອ້າງອີງ, ນັ້ນແມ່ນການໂຕ້ຖຽງຜ່ານການໂຕ້ຖຽງ java class ທົ່ວໄປຕ້ອງຈໍາເປັນປະເພດຂອງ class. ແບບງ່າຍໆດັ່ງກ່າວ, ເຊັ່ນວ່າ, ຄູ່ຫຼືຍາວ, ບໍ່ສາມາດຖືກສົ່ງຜ່ານ. ໃນຄໍາສັບຕ່າງໆອື່ນ, ເສັ້ນດັ່ງຕໍ່ໄປນີ້ຂອງການປະກາດຫ້ອງຄູ່ບໍ່ຖືກຕ້ອງ: Pair obj. ຢ່າງໃດກໍຕາມ, ການຈໍາກັດນີ້ບໍ່ແມ່ນບັນຫາທີ່ຮ້າຍແຮງ, ເພາະວ່າ Java ມີລະດັບ wrapper ທີ່ສອດຄ້ອງກັນສໍາລັບແຕ່ລະປະເພດ primitive. ແນ່ນອນວ່າ, ຖ້າທ່ານຕ້ອງການປະກອບເປັນຈໍານວນເຕັມແລະມູນຄ່າທີ່ສົມເຫດສົມຜົນໃນຊັ້ນ Pair, ຊຸດອັດຕະໂນມັດຈະເຮັດທຸກຢ່າງໃຫ້ທ່ານ: Pair obj = new pair <> (25, true).

ອີກຂໍ້ຈໍາກັດທີ່ຮ້າຍແຮງແມ່ນບໍ່ສາມາດສ້າງຕົວຢ່າງຂອງພາລາມິເຕີປະເພດ. ດັ່ງນັ້ນເສັ້ນດັ່ງຕໍ່ໄປນີ້ຈະເຮັດໃຫ້ເກີດຄວາມຜິດພາດການລວບລວມ: T first = new T (). ນີ້ແມ່ນຈະແຈ້ງ, ເນື່ອງຈາກວ່າທ່ານບໍ່ຮູ້ລ່ວງຫນ້າວ່າຈະມີການໂຕ້ຕອບຢ່າງເຕັມທີ່ຫຼືໂຕ້ຕອບບໍ່ມີຕົວຕົນ. ດຽວກັນສໍາລັບການສ້າງແຖວ.

ປະເພດຈໍາກັດ

ເລື້ອຍໆມີສະຖານະການໃນເວລາທີ່ຈໍາເປັນຕ້ອງຈໍາກັດບັນຊີລາຍຊື່ຂອງປະເພດທີ່ສາມາດຖືກສົ່ງຜ່ານເປັນການໂຕ້ຖຽງກັບຊັ້ນຮຽນທົ່ວໄປຂອງ java. ໃຫ້ສົມມຸດວ່າໃນຊັ້ນຮຽນ Pair ຂອງພວກເຮົາພວກເຮົາຕ້ອງການກໍານົດຄ່າຕົວເລກເທົ່ານັ້ນສໍາລັບການປະຕິບັດຄະນິດສາດຕໍ່ກັບເຂົາເຈົ້າ. ເພື່ອເຮັດສິ່ງນີ້, ພວກເຮົາຈໍາເປັນຕ້ອງກໍານົດຂອບເຂດເທິງຂອງພາລາມິເຕີປະເພດ. ນີ້ແມ່ນປະຕິບັດໂດຍໃຊ້ການປະກາດ superclass inherited ໂດຍການໂຕ້ຖຽງທັງຫມົດທີ່ຜ່ານໃນວົງເລີ້ມມຸມ. ມັນຈະມີລັກສະນະຄ້າຍຄືນີ້: Pair Class . ໃນວິທີການນີ້, ຄອມໄພເລີຮຽນຮູ້ວ່າແທນທີ່ຈະເປັນພາລາມິເຕີ T, ທ່ານສາມາດທົດແທນໄດ້ລະຫັດຈໍານວນຫລືຫນຶ່ງໃນຊັ້ນຍ່ອຍຂອງມັນ.

ນີ້ແມ່ນວິທີການທົ່ວໄປ. ຂໍ້ຈໍາກັດດັ່ງກ່າວແມ່ນຖືກນໍາໃຊ້ເພື່ອຮັບປະກັນຄວາມສອດຄ່ອງຂອງພາລາມິເຕີໃນປະເພດດຽວກັນ. ພິຈາລະນາຕົວຢ່າງກ່ຽວກັບຫ້ອງຮຽນຄູ່ຂອງພວກເຮົາ: ຄູ່ປະເພດ . ໃນທີ່ນີ້ພວກເຮົາບອກຜູ້ຂຽນວ່າ T ປະເພດ T ສາມາດເປັນຕົວຕົນ, ແລະພິມ V ຕ້ອງໄດ້ປະເພດ T ຫຼືຫນຶ່ງໃນ subclasses ຂອງມັນ.

ການຈໍາກັດ "ຈາກຂ້າງລຸ່ມນີ້" ເກີດຂື້ນໃນແບບດຽວກັນ, ແຕ່ແທນທີ່ຈະຂະຫຍາຍຄໍາສັບ, ຄໍາສັບ Super ຖືກຂຽນໄວ້. ດັ່ງນັ້ນ, ການປະກາດຂອງຊັ້ນ Pair ສະແດງໃຫ້ເຫັນວ່າແທນທີ່ຈະ T, ArrayList ຫຼືຫ້ອງຮຽນໃດໆຫຼື interface ທີ່ມັນ inherits ສາມາດແທນໄດ້.

Generics Java Methods and Constructors

ໃນ generalizations Java ສາມາດຖືກນໍາໃຊ້ບໍ່ພຽງແຕ່ກ່ຽວກັບການຮຽນ, ແຕ່ຍັງວິທີການ. ດັ່ງນັ້ນ, ວິທີທົ່ວໄປສາມາດໄດ້ຮັບການປະກາດໃນຊັ້ນຮຽນປົກກະຕິ.

ດັ່ງທີ່ທ່ານໄດ້ເຫັນໃນຮູບຂ້າງເທິງ, ບໍ່ມີຫຍັງທີ່ສັບສົນໃນການປະກາດວິທີການທົ່ວໄປ. ມັນແມ່ນພຽງພໍທີ່ຈະໃສ່ວົງເລີ້ມມຸມກ່ອນທີ່ຈະໃຊ້ວິທີການກັບຄືນມາແລະກໍານົດພາລາມິເຕີປະເພດຢູ່ໃນພວກມັນ.

ໃນກໍລະນີຂອງຜູ້ສ້າງ, ທຸກສິ່ງທຸກຢ່າງແມ່ນເຮັດໃນແບບດຽວກັນ:

ຕົວຍຶດສຽບໃນກໍລະນີນີ້ຖືກຈັດໃສ່ກ່ອນຊື່ຂອງຕົວສ້າງ, ເນື່ອງຈາກວ່າມັນບໍ່ກັບຄືນມູນຄ່າໃດໆ. ຜົນຂອງການເຮັດວຽກຂອງໂຄງການທັງສອງຈະແມ່ນ:

Integer

String

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 lo.delachieve.com. Theme powered by WordPress.