אסימונים מסוג Super Type ב- Java Generics

1. סקירה כללית

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

2. המחיקה

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

בתים [] data = // להביא json מאיפה שהוא String json = objectMapper.readValue (data, String.class);

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

עם זאת, איננו יכולים להגדיר את אותה הציפייה לסוגים גנריים באותה קלות:

מפה json = objectMapper.readValue (נתונים, Map.class); // לא ירכיב

ג'אווה מוחק מידע מסוג כללי במהלך האוסף. לָכֵן, פרמטרים מסוג כללי הם רק חפץ של קוד המקור ויעדרו בזמן הריצה.

2.1. אימות מחדש

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

הסוגים המאוחדים ב- Java הם כדלקמן:

  • סוגים פרימיטיביים פשוטים כגון ארוך
  • הפשטות לא גנריות כגון חוּט אוֹ ניתן לרוץ
  • סוגים גולמיים כגון רשימה אוֹ מפת גיבוב
  • סוגים גנריים בהם כל הסוגים הם כרטיסי בר ללא גבולות כגון רשימה אוֹ מפת גיבוב
  • מערכים מסוגים מאוחדים אחרים כגון מחרוזת [], int [], רשימה [], אוֹ מַפָּה[]

כתוצאה מכך, איננו יכולים להשתמש במשהו כמו Map.class בגלל ה מַפָּה אינו סוג מאוחד.

3. אסימון סוג סופר

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

מחלקה מופשטת ציבורית TypeReference {private final סוג סוג; ציבור TypeReference () {Type superclass = getClass (). getGenericSuperclass (); type = ((ParameterizedType) superclass) .getActualTypeArguments () [0]; } ציבורי getType () {סוג סוג return; }}

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

לדוגמה, אנו יכולים ליצור פנימי אנונימי:

TypeReference אסימון = TypeReference חדש() {};

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

  • ראשית, היא מקבלת את המטא-נתונים הגנריים-סופריים למופע מסוים זה - במקרה זה, הסופר-קלאס הגנרי הוא TypeReference
  • לאחר מכן הוא מקבל ומאחסן את פרמטר הסוג בפועל עבור סופר קלאס הגנרי - במקרה זה, זה יהיה מַפָּה

גישה זו לשימור המידע מהסוג הגנרי מכונה בדרך כלל אסימון מסוג סופר:

TypeReference אסימון = TypeReference חדש() {}; סוג סוג = token.getType (); assertEquals ("java.util.Map", type.getTypeName ()); הקלד [] typeArguments = (((ParameterizedType) סוג). GetActualTypeArguments (); assertEquals ("java.lang.String", typeArguments [0] .getTypeName ()); assertEquals ("java.lang.Integer", typeArguments [1] .getTypeName ());

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

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

TypeReference אסימון = TypeReference חדש() {}; מפה json = objectMapper.readValue (נתונים, אסימון);

4. מסקנה

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

כרגיל, כל הדוגמאות זמינות ב- GitHub.


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