ClassCastException: לא ניתן להעביר מערכים $ ArrayList ל- ArrayList

1. הקדמה

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

לקבלת היכרות מעמיקה יותר עם חריגים ב- Java, עיין כאן.

2. פרטי ClassCastException

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

מחרוזת [] strArray = מחרוזת חדשה [] {"ג'ון", "שלג"}; ArrayList strList = (ArrayList) Arrays.asList (strArray); System.out.println ("רשימת מחרוזות:" + strList);

הקוד לעיל גורם ClassCastException לאן אנו מטילים את ערך ההחזר של Arrays.asList (strArray) ל רשימת מערך.

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

כאשר הקוד פועל, נבדק היישום בפועל שמוצא זאת Arrays.asList() מחזירה an Arrays $ List ובכך גורם ל ClassCastException.

3. החלטה

אנחנו יכולים פשוט להכריז על שלנו רשימת מערך כ רשימה כדי להימנע מחריג זה:

רשימת strList = Arrays.asList (strArray); System.out.println ("רשימת מחרוזות:" + strList);

עם זאת, על ידי הכרזת התייחסותנו כ- רשימה אנחנו יכולים להקצות כל כיתה שמיישמת את רשימה מִמְשָׁק, כולל ה מערך $ ArrayList הוחזר על ידי שיחת השיטה.

4. סיכום

במאמר זה ראינו את ההסבר למה בדיוק A ClassCastException ואילו אמצעים עלינו לנקוט זה פותרים בעיה זו.

את הקוד המלא ניתן למצוא ב- GitHub.