ماذا يمكننا أن يلقي اجهة جافا ل* * أي فئة غير النهائية؟

StackOverflow https://stackoverflow.com/questions/1235068

  •  22-07-2019
  •  | 
  •  

سؤال

import java.util.Collection;


public class Test
{
    public static void main(String[] args)
    {
        Collection c = null;
        Test s = null;

        s = (Test) c;
    }
}

في نموذج التعليمات البرمجية أعلاه، أنا الصب كائن مجموعة إلى كائن اختبار. (تجاهل مؤشر فارغة). اختبار له <م> لن العلاقة إلى المجموعة على الإطلاق، ولكن هذا البرنامج تمر جميع الشيكات وقت التحويل البرمجي.

وأنا أتساءل لماذا يحدث هذا. بلدي الافتراض هو أن واجهات يتم تجاهل لأنها معقدة للغاية. ليس لديهم فائقة نوع شائع وكل فئة يمكن تنفيذ عدة واجهات، وبالتالي فإن التسلسل الهرمي فئة / واجهة تكون معقدة للغاية للبحث كفاءة؟

وبخلاف هذا السبب أنا الحيرة بالرغم من ذلك. لا أحد يعرف؟!

هل كانت مفيدة؟

المحلول

هو

"غير نهائي" والكلمة هنا. قد يكون لديك فئة أخرى

public class Test2 extends Test implements Collection

والذي سبيل المثال في نهاية المطاف تم تعيينه إلى s مما يلقي قانونية تماما.

نصائح أخرى

ولأن فئة فرعية من Test من المحتمل أن يكون نوع فرعي من Collection كذلك! تم تصميم مواصفات اللغة أن يكون قليلا مرنة لتسمح يلقي التي يمكن التحقق منها في وقت التشغيل.

ونحن يمكن مشاهدته من مختلف المحتملين: يمكن محمل أي فئة غير النهائية إلى أي واجهة

import java.util.function.Predicate;

public class Test {
    public static void main(String[] args) {
        Predicate check;

        try {
            /*It's ok to cast to ANY interface because the Base class is not final.
              Java compiler allows it because some class may extend it 
              and implement the predicate interface. 
              So java compiler can check it only at runtime time not compile time.             
            */
            check = (Predicate)(new Base());

            /*
             Java compiler doesn’t allow it because the BaseFinal is final.
             And it means that no one can extend it and implement interface Predicate. 
             So java compiler can check it at compile time.
            */
            //check = (Predicate)(new BaseFinal()); 
        } catch (ClassCastException e) {
            System.out.println("Class Cast Exception");
        }
        check = (Predicate)(Base)(new Child());
    }    
}
final class BaseFinal {};

class Base {}

class Child extends Base implements Predicate {
    public boolean test(Object t) { return true; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top