367. The difference between Java generics and C# generics

הכרנו בעבר את המושג של Generics בC# (ראו גם טיפים 26-34).

קיים מושג מקביל בJava. עם זאת, Generics בJava אינם נחשבים ל”Real Generics”.

הפעם נדבר על כך ונסביר מה ההבדל בין Generics בין שתי השפות.


Generics בC# מאפשרים לנו לכתוב קוד כזה:

1
List<Person> peopleList = new List<Person>();

מה שהדבר הזה עושה מאחורי הקלעים זה יוצר טיפוס בזמן ריצה בו מוחלף בכל מקום הטיפוס הגנרי בטיפוס שציינו (Person).

אנחנו נהנים משני יתרונות עיקריים:

  • Type Safety – הקומפיילר לא יאפשר לנו לטעות בטיפוסים שפונקציות שמקבלות או מחזירות, בכל פונקציה שאמורה לקבל Person, לא נוכל להכניס טיפוס אחר. זה יתרון שפותר לנו בעיות שהיו לנו בעבודה עםArrayList וחבריו
  • ביצועים – מאחר ונוצר טיפוס אמיתי בזמן ריצה, אין צורך בהסבות, ולכן אנחנו חוסכים את ההסבות, וכך נהנים מביצועים טובים יותר.

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

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


Generics בJava מאפשרים לכתוב קוד כזה:

1
ArrayList<Person> peopleList = new ArrayList<Person>();

על פניו, זה נראה דומה.

מה שקורה כאן זה משהו שונה לגמרי – הקומפיילר מאחורי הקלעים יצור ArrayList רגיל. כאשר נבצע פעולה כגון זו:

1
peopleList.add(new Person());

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

כאשר נבצע פעולה כזאת:

1
Person person = peopleList.get(0);

מאחר וPeopleList הוא בסה"כ ArrayList פשוט, הקומפיילר יתרגם אותה לפעולה הזאת:

1
Person person = (Person) peopleList.get(0);

אנחנו רואים שאנחנו לא נהנים מהביצועים הטובים יותר שיכלו לתת לנו Generics ע"י מניעת ההסבה הנ"ל.

בנוסף, הטיפוס הגנרי קיים רק בזמן קימפול. בזמן ריצה, מאחר והקומפיילר מתרגם הכל למחלקות לא גנריות, לא קיים הטיפוס ArrayList<Person>. הדבר הזה לא מאפשר לכל מיני מנגנונים בזמן ריצה לנתח את הטיפוס בReflection, ולכן לא ניתן לממש כל מיני מנגנונים דומים לאלו של C#.

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


שבוע גנרי וקפה טוב.

שתף