שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2025 - גנריות
נתון קוד הבא
הביטוי \langle \text{T extends Comparable<T> & Cloneable} \rangle תקין ומגדיר שני אילוצים על הטיפוס הגנרי T - שניהם חייבים להתקיים.
מה יקרה כאשר ננסה לקמפל ולהריץ את הקוד?
בחרו בטענה הנכונה ביותר.
א. הקוד לא מתקמפל
ב. הקוד מתקמפל, אך נקבל שגיאת זמן ריצה
ג. הקוד תקין ומדפיס 3
ד. הקוד תקין ומדפיס 1
ה. אף אחת מהטענות הנ"ל אינה נכונה
נמקו בקצרה את תשובתכםן.
הביטוי \langle \text{T extends Comparable<T> & Cloneable} \rangle תקין ומגדיר שני אילוצים על הטיפוס הגנרי T - שניהם חייבים להתקיים.
מה יקרה כאשר ננסה לקמפל ולהריץ את הקוד?
בחרו בטענה הנכונה ביותר.
א. הקוד לא מתקמפל
ב. הקוד מתקמפל, אך נקבל שגיאת זמן ריצה
ג. הקוד תקין ומדפיס 3
ד. הקוד תקין ומדפיס 1
ה. אף אחת מהטענות הנ"ל אינה נכונה
נמקו בקצרה את תשובתכםן.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ג2025סמסטר ב
★★★★★
גנריותממשקיםמעקב אחר קוד
בדקו האם המחלקה
A עומדת באילוצים הגנריים שהוגדרו עבור המתודה max. לאחר מכן, עקבו אחר ביצוע המתודה עם הקלט הנתון מה-main.הטענה הנכונה היא ג'. הקוד תקין ומדפיס 3.
ניתוח הקוד:
1. קומפילציה: המתודה
2. זמן ריצה:
* במתודה
* בתוך המתודה
* מימוש המתודה
* התנאי
* לכן, המתודה
* הקריאה הבאה היא
* לבסוף, הערך
לסיכום, הקוד תקין לחלוטין, ירוץ ללא שגיאות וידפיס את הערך 3.
ניתוח הקוד:
1. קומפילציה: המתודה
max היא מתודה גנרית עם פרמטר טיפוס T. על הטיפוס T מוצבים שני אילוצים (bounds): הוא חייב לממש את הממשק Comparable<T> וגם את הממשק Cloneable. המחלקה A אכן מממשת את שני הממשקים הללו: public class A implements Comparable<A>, Cloneable. לכן, הקריאה למתודה max עם אובייקטים מסוג A היא חוקית, והקוד יעבור קומפילציה ללא שגיאות.2. זמן ריצה:
* במתודה
main, אנו קוראים ל-max(new A(2), new A(3)). * בתוך המתודה
max, מתבצעת ההשוואה x.compareTo(y). במקרה זה, (new A(2)).compareTo(new A(3)).* מימוש המתודה
compareTo במחלקה A הוא return x - other.x;. לכן, תוצאת ההשוואה היא 2 - 3 = -1.* התנאי
if(x.compareTo(y)>0), כלומר if(-1 > 0), הוא שקרי.* לכן, המתודה
max תחזיר את האובייקט y, שהוא new A(3).* הקריאה הבאה היא
.getX() על האובייקט שהוחזר. (new A(3)).getX() מחזיר את הערך של השדה x באובייקט זה, שהוא 3.* לבסוף, הערך
3 יודפס למסך.לסיכום, הקוד תקין לחלוטין, ירוץ ללא שגיאות וידפיס את הערך 3.