Class.isInstance לעומת Class.isAssignableFrom

1. הקדמה

במדריך מהיר זה, אנו נסתכל על ההבדל בין Class.isInstance ו Class.isAssignableFrom. נלמד כיצד להשתמש בכל שיטה ומה ההבדלים ביניהן.

2. התקנה

בואו נקבע ממשק וכמה שיעורים לשימוש בזמן שאנחנו חוקרים את Class.isInstance ו Class.isAssignableFrom פונקציונליות.

ראשית, בואו נגדיר ממשק:

צורת ממשק ציבורי {}

לאחר מכן, בואו נגדיר מחלקה שמיישמת צוּרָה:

יישומי משולש בכיתה ציבורית צורה {}

כעת ניצור מחלקה שתארך משולש:

מחלקה ציבורית IsoscelesTriangle מאריך משולש {}

3. Class.isInstance

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

בואו נסתכל כיצד נוכל להשתמש ב- זה אינסטנס שיטה עם הממשק והשיעורים שהגדרנו:

@ מבחן ציבורי בטל כאשרUsingIsInstanceProperly_desiredResultsHappen () {צורת צורה = משולש חדש (); משולש משולש = משולש חדש (); IsoscelesTriangle isoscelesTriangle = חדש IsoscelesTriangle (); משולש שווה שוקיים משולש 2 = שווה שוקיים חדשים (); Shape nonspecificShape = null; assertTrue (Shape.class.isInstance (צורה)); assertTrue (Shape.class.isInstance (משולש)); assertTrue (Shape.class.isInstance (משולש משולש)); assertTrue (Shape.class.isInstance (שווה שוקיים)); assertFalse (Shape.class.isInstance (nonspecificShape)); assertTrue (Triangle.class.isInstance (צורה)); assertTrue (Triangle.class.isInstance (משולש)); assertTrue (Triangle.class.isInstance (משולש משולש)); assertTrue (Triangle.class.isInstance (שווה שוקיים)); assertFalse (IsoscelesTriangle.class.isInstance (צורה)); assertFalse (IsoscelesTriangle.class.isInstance (משולש)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle)); assertTrue (IsoscelesTriangle.class.isInstance (isoscelesTriangle2)); }

כמו שאנו יכולים לראות, צד ימין יכול להיות שווה או ספציפי יותר לצד שמאל. מתן ריק אל ה זה אינסטנס השיטה מחזירה שֶׁקֶר.

4. Class.isAssignableFrom

ה Class.isAssignableFrom השיטה תחזור נָכוֹן אם ה מעמד בצד שמאל של ההצהרה זהה או שהוא מעמד-על או ממשק-על של המסופק מעמד פָּרָמֶטֶר.

בואו נשתמש בשיעורים שלנו עם isAssignableFrom שיטה:

@ מבחן פומבי בטל כאשר UsingIsAssignableFromProperly_desiredResultsHappen () {צורת צורה = משולש חדש (); משולש משולש = משולש חדש (); IsoscelesTriangle isoscelesTriangle = חדש IsoscelesTriangle (); משולש שווה שוקיים משולש 2 = שווה שוקיים חדשים (); assertFalse (shape.getClass (). isAssignableFrom (Shape.class)); assertTrue (shape.getClass (). isAssignableFrom (shape.getClass ())); assertTrue (form.getClass (). isAssignableFrom (משולש. getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (shape.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (משולש. getClass (). isAssignableFrom (Shape.class)); assertTrue (משולש. getClass (). isAssignableFrom (צורה. getClass ())); assertTrue (משולש. getClass (). isAssignableFrom (משולש. getClass ())); assertTrue (משולש. getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (משולש. getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (Shape.class)); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (Shape.class)); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (shape.getClass ())); assertFalse (isoscelesTriangle2.getClass (). isAssignableFrom (triangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle.getClass ())); assertTrue (isoscelesTriangle2.getClass (). isAssignableFrom (isoscelesTriangle2.getClass ())); }

כמו עם זה אינסטנס לדוגמא, אנו יכולים לראות בבירור כי צד ימין חייב להיות זהה או ספציפי יותר מצד שמאל. אנו יכולים גם לראות שלעולם לא נוכל להקצות את שלנו צוּרָה מִמְשָׁק.

5. ההבדלים

כעת, לאחר שהצבנו כמה דוגמאות מפורטות, בואו נעבור על כמה מההבדלים:

  1. על מנת להשתמש זה אינסטנס, עלינו לדעת מה זה אחד השיעורים בזמן הקומפילציה.
  2. רק isAssignableFrom ניתן להשתמש עם פרימיטיבים. עלינו לציין זאת אם אנו משתמשים בפרימיטיבים, השיטה רק תחזור נָכוֹן אם ה מעמד חפץ ו מעמד פרמטר זהים לחלוטין מעמד.
  3. ה isAssignableFrom השיטה תזרוק א NullPointerException אם האובייקט המשמש משני צידי הביטוי הוא ריק. אם אתה מספק א ריק אל ה זה אינסטנס שיטה, זה יחזור שֶׁקֶר.
  4. עלינו לחשוב זה אינסטנס כמענה לשאלה האם האובייקט המסופק הוא הסוג שאנו משווים אותו אליו (ישירות או באמצעות ממשק או ירושה). אנחנו יכולים לחשוב על isAssignableFrom כמענה לשאלה האם אנו יכולים להגדיר את מחלקת הפרמטר כמעמד האובייקט. במילים אחרות, רצון משולש משולש = שווה שוקיים חדשים () לְלַקֵט?

6. מסקנה

במדריך קצר זה בחנו את שני Class.isInstance ו Class.isAssignableFrom שיטות וחקר את השימוש בהן ובמה הן שונות.

כמו תמיד, את קוד הדוגמה למדריך זה ניתן למצוא ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found