java.lang.ClassCastException - תיקיות שונות

bashib

New member
java.lang.ClassCastException - תיקיות שונות

שלום,
לצורך פרויקט בלימודים יצרתי אלגוריתם שמייצר מבוך ואלגוריתם שפותר אותו.
בדרישות המטלה המחלקות מחולקות לתיקיות (package) שונים.
כך שאני מייבאת לתוכנית שלי את כל הקבצים הכוללים את האלגוריתם הבונה, ובתוכנית הנוכחית יוצרת אלגוריתמים שונים לחיפוש, בכדי שאוכל לעבוד עם האלגוריתם על מבוך ספציפי אני מקבלת ממשק בפונ' שמייצרת חיפוש.
ובמחלקה בתוכנית החדשה ירשתי את המבוך שקיבלתי מהאלגוריתם חיפוש

אך כשאני מנסה להריץ הוא לא נותן לי לעשות קסטינג בין המחלקות.

יש דרך לפתור בעיה זו. (הקסטינג הוא להפוך מחלקת אב למחלקה היורשת ממנו)

זה השגיאה:

Exception in thread "main" java.lang.ClassCastException: algorithms.mazeGenerators.Maze3d cannot be cast to algorithms.search.Maze3dDomain
at algorithms.search.Run.main(Run.java:59)

ניסיתי קסטינגים שונים במקומות שונים, זה דוגמה לאחד:

MyMaze3dGenerator alg = new MyMaze3dGenerator();
// Maze3d m=new Maze3dDomain(5);

Maze3dDomain mazeSearchable = (Maze3dDomain)alg.generate(5); //creat new maze3d

BFS bfs = new BFS();
bfs.search(mazeSearchable);
 

nocgod

New member
למרות שזה לא קשור לפורום

תקרא את השגיאה.
אתה מנסה לעשות cast מטיפוס שנקרא Maze3d לטיפוס שנקרא Maze3dDomain
תשים לב למה אתה עושה.
 

bashib

New member
למה?

1. למה זה לא קשור לפורום, זה פורום תכנות, לא?
2. אני יודעת. הטיפוס Maze3dDomain יורש מ Maze3d , בפולימורפיזם לא אמור להיות בעיה לעשות קסט לטיפוס בן. לא?
 

nocgod

New member
זה שהוא יורש ממנו לא אומר שאתה ישר יכול לעשות לו cast

אם אתה מחזיר instance של Maze3d אין שום סיבה שבעולם שהוא יסכים לעשות cast ל Maze3dDomain, גם אם Maze3dDomain יורש (בן של) מ Maze3d.

בכל מקרה - תבדוק טוב טוב מה אתה מחזיר ולמה אתה מנסה לעשות cast

למה זה לא קשור לפורום הספציפי? כי זה פורום פיתוח .net לא java...
 

bashib

New member
תודה רבה

מצטערת, לא ידעתי . האם יש פורום מיוחד לJAVA כאן?

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

תודה רבה
 

nocgod

New member
לא יודע אם יש...

מה שאתה כן יכול לעשות זה להשתמש בdesign pattern שנקרא adapter pattern.
המטרה היא לקחת 2 דברים שלא מתאימים ולהכניס ביניהם מתווך שבעצם יעשה את התיאום בין Maze3d למחלקה עם השם הארוך.

קח בחשבון שאני לא רואה סיבה שיהיו לך 2 מחלקות כדי לייצג מבוך. תעבור על הקוד שלך ותנסה להבין איפה סיבכת.
תזכור את עיקרון KISS - keep it simple stupid
בכל מקום שסיבכת תפשט.

בהצלחה.
 

bashib

New member
תודה, אכן, אני מנסה כעת לתת את המבוך כמופע ולא כירושה

כמו adapter pattern
וזה באמת פתר את הבעיה.
&nbsp
מכיון שזה פרויקט לימודי, אני חייבת לראות חלק מסוים כחלק שייבאתי ואין לי דרך לגעת בו.
וכו.. אז אני חייבת לבצע בנפרד.
&nbsp
תודה רבה
 
למעלה