Menu
Coddy logo textTech

סיכום – מכל גנרי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 58 מתוך 87.

challenge icon

אתגר

קל

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

תארגן את הקוד שלך בשלושה קבצים:

  • Container.java: צור מחלקה גנרית Container<T> שמנהלת אוסף של פריטים. הקונטיינר שלך צריך להשתמש באופן פנימי ב-ArrayList<T> כדי לאחסן איברים. כלול שיטות כדי add(T item) להוסיף איבר, get(int index) לשלוף איבר ממיקום מסוים, size() להחזיר את מספר הפריטים, ו-isEmpty() לבדוק אם אין בקונטיינר איברים. הוסף גם שיטת getAll() שמחזירה את הרשימה הפנימית.
  • ContainerUtils.java: צור מחלקת עזר עם שיטות גנריות סטטיות שפועלות עם הקונטיינרים שלך:

    printAll(Container<?> container) - משתמשת ב-wildcard לא חסום כדי להדפיס את כל האיברים בכל קונטיינר, איבר אחד בכל שורה.

    countItems(Container<? extends Number> container) - משתמשת ב-wildcard עם חסם עליון כדי לחשב את הסכום של כל הערכים המספריים בקונטיינר, ומחזירה את התוצאה כ-double.

    addDefaults(Container<? super Integer> container) - משתמשת ב-wildcard עם חסם תחתון כדי להוסיף את המספרים השלמים 1, 2 ו-3 לכל קונטיינר שיכול להכיל מספרים שלמים.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - שיטה גנרית שמחזירה את האיבר האחרון בקונטיינר, או את ערך ברירת המחדל אם הקונטיינר ריק.

  • Main.java: חבר את מערכת הקונטיינרים הגנרית שלך! תקבל שלוש קלטים: מילה (String), מספר שלם ומספר עשרוני.

    תחילה, צור Container<String> והוסף אליו את המילה פעמיים. הדפס String container: ואז השתמש ב-printAll כדי להציג את התוכן שלו.

    לאחר מכן, צור Container<Double> והוסף אליו את המספר העשרוני. הדפס שורה ריקה, ואז Number sum: [sum] באמצעות sumValues.

    לאחר מכן, צור Container<Number> וקרא ל-addDefaults עליו. הדפס שורה ריקה, ואז After adding defaults: והשתמש ב-printAll כדי להציג את התוכן.

    לבסוף, צור Container<Integer> ריק והשתמש ב-getLastOrDefault עם המספר השלם שהתקבל בקלט בתור ערך ברירת המחדל. הדפס שורה ריקה, ואז Last or default: [result].

תקבל שלוש קלטים לפי הסדר: מילה (String), מספר שלם ומספר עשרוני.

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

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קראו את הקלטים
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: צרו Container<String> והוסיפו את המילה פעמיים
        // הדפיסו "String container:" ואז השתמשו ב-ContainerUtils.printAll()
        
        // TODO: צרו Container<Double> והוסיפו את הערך העשרוני
        // הדפיסו שורה ריקה, ואז "Number sum: [sum]" באמצעות ContainerUtils.countItems()
        
        // TODO: צרו Container<Number> וקראו עליו ל-ContainerUtils.addDefaults()
        // הדפיסו שורה ריקה, ואז "After adding defaults:" והשתמשו ב-ContainerUtils.printAll()
        
        // TODO: צרו Container<Integer> ריק
        // השתמשו ב-ContainerUtils.getLastOrDefault() עם intValue כערך ברירת המחדל
        // הדפיסו שורה ריקה, ואז "Last or default: [result]"
    }
}

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

תרגלו בעצמכם: קומפיילר Java אונליין