הסברה כללית מסוג יעד בג'אווה

1. הקדמה

Type Inference הוצג ב- Java 5 כדי להשלים את הכנסת הגנריות והורחב באופן משמעותי בעקבות מהדורות Java, המכונה גם הסקת Target Type Type.

במדריך זה נחקור את המושג הזה בעזרת דוגמאות קוד.

2. גנריות

גנריות סיפקו לנו יתרונות רבים כמו בטיחות מוגברת של סוגים, הימנעות משגיאות יציקת סוג ואלגוריתמים גנריים. תוכלו לקרוא עוד על גנריות במאמר זה.

עם זאת, ההקדמה של גנריות הביאו לצורך בכתיבת קוד הדוד בשל הצורך להעביר פרמטרים מסוגים. חלק מהדוגמאות הן:

מַפָּה mapOfMaps = HashMap חדש(); רשימה strList = Collections.emptyList (); List intList = Collections.emptyList ();

3. הקלד הסקה לפני Java 8

כדי להפחית את מילוליות הקוד המיותרת, Type Inference הוצג ל- Java אשר הוא תהליך הגזירה אוטומטית של סוגי נתונים לא מפורטים של ביטוי המבוסס על המידע ההקשר.

כעת, אנו יכולים להפעיל את אותם סוגים ושיטות כלליות מבלי לציין את סוגי הפרמטרים. המהדר מציג באופן אוטומטי את סוגי הפרמטרים בעת הצורך.

אנו יכולים לראות את אותו קוד באמצעות הרעיון החדש:

רשימה strListInferred = Collections.emptyList (); List intListInferred = Collections.emptyList (); 

בדוגמה שלעיל, בהתבסס על סוגי ההחזר הצפוי רשימה ו רשימה, המהדר מסוגל להסיק את פרמטר הסוג לשיטה הגנרית הבאה:

סופי ציבורי סטטי רשימה ריק רשימה () 

כפי שאנו רואים, הקוד שנוצר הוא תמציתי. כעת, אנו יכולים לקרוא לשיטות גנריות כשיטה רגילה אם ניתן להסיק את פרמטר הסוג.

בג'אווה 5 נוכל לבצע סוג ההסקה בהקשרים ספציפיים כפי שמוצג לעיל.

Java 7 הרחיב את ההקשרים שבהם ניתן היה לבצע אותו. היא הציגה את מפעיל היהלומים . תוכלו לקרוא עוד על מפעיל היהלומים במאמר זה.

עַכשָׁיו, אנו יכולים לבצע פעולה זו עבור בוני כיתות גנריות בהקשר למשימה. דוגמה אחת כזו היא:

מַפָּה mapOfMapsInferred = HashMap חדש ();

כאן, מהדר Java משתמש בסוג ההקצאה הצפוי כדי להסיק את פרמטרי הסוג אליהם מפת גיבוב בַּנַאִי.

4. הסקה כללית מסוג יעד - Java 8

Java 8 הרחיבה עוד יותר את היקף ה- Type Inference. אנו מתייחסים ליכולת ההסקה המורחבת הזו כהסקה כללית מסוג יעד. תוכלו לקרוא את הפרטים הטכניים כאן.

ג'אווה 8 הציגה גם Lambda Expressions. לביטויי למבדה אין סוג מפורש. ניתן להסיק את סוגם על ידי התבוננות בסוג היעד של ההקשר או המצב. סוג היעד של ביטוי הוא סוג הנתונים אותו מצפה מהדר Java בהתאם למקום בו מופיע הביטוי.

Java 8 תומכת בהסקות באמצעות Target-Type בהקשר לשיטה. כאשר אנו קוראים לשיטה כללית ללא ארגומנטים מסוג מפורש, המהדר יכול להסתכל על קריאת המתודה והצהרות המתאימות כדי לקבוע את ארגומנט הסוג (או הארגומנטים) ההופכים את הקריאה ליישומית.

הבה נבחן קוד לדוגמא:

סטטי רשימה להוסיף (רשימת רשימה, T a, T b) {list.add (a); list.add (ב); רשימת החזרה; } רשימת strListGeneralized = הוסף (ArrayList חדש (), "abc", "def"); רשימה intListGeneralized = הוסף (ArrayList חדש (), 1, 2); רשימה numListGeneralized = הוסף (ArrayList חדש (), 1, 2.0);

בקוד, רשימת מערך אינו מספק את טיעון הסוג במפורש. לכן, המהדר צריך להסיק זאת. ראשית, המהדר בוחן את הטיעונים של שיטת ההוספה. לאחר מכן, הוא בודק את הפרמטרים שהועברו בקריאות שונות.

זה מבצע מסקנה לתחולת קריאה ניתוח כדי לקבוע אם השיטה חלה על קריאות אלה. אם קיימות שיטות מרובות עקב עומס יתר, המהדר יבחר בשיטה הספציפית ביותר.

לאחר מכן, המהדר מבצע הסקת סוג קריאה ניתוח לקביעת טיעוני הסוג.סוגי היעד הצפויים משמשים גם בניתוח זה. זה מסיק את הטיעונים בשלושת המקרים כ- רשימת מערך, רשימת מערך ו רשימת מערך.

הסקת סוג יעד מאפשרת לנו לא לציין סוגים לפרמטרים של ביטוי למבדה:

רשימת intList = Arrays.asList (5, 2, 4, 2, 1); Collections.sort (intList, (a, b) -> a.compareTo (b)); רשימה strList = Arrays.asList ("אדום", "כחול", "ירוק"); Collections.sort (strList, (a, b) -> a.compareTo (b));

הנה, הפרמטרים א ו ב אין סוגים מוגדרים במפורש. הסוגים שלהם מוסברים כ- מספר שלם בביטוי למבה הראשון וכמו חוּט בשנייה.

5. מסקנה

במאמר מהיר זה, סקרנו את סוג ההיסק, שיחד עם גנריות וביטוי למבדה מאפשר לנו לכתוב קוד Java תמציתי.

כרגיל, ניתן למצוא את קוד המקור המלא ב- Github.


$config[zx-auto] not found$config[zx-overlay] not found