2013-10-02 2 views
8

जाहिर है एक असंबंधित इंटरफ़ेस करने के लिए एक वर्ग के कास्टिंग, यह एक संकलन त्रुटि में परिणाम है क्योंकि अध्यक्ष बिल्ली से संबंधित नहीं है:जावा:

class Chair {} 
class Cat {} 

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

क्यों है, तो यह है कि मैं केवल रन समय था जब में एक अपवाद मिल मैंने असंबद्ध इंटरफेस फर्नीचर के लिए एक बिल्ली संदर्भ डाला, जबकि संकलक स्पष्ट रूप से बता सकता है कि बिल्ली फर्नीचर लागू नहीं करता है?

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 
+0

क्योंकि पॉलिमॉर्फिज्म रन टाइम पर होता है। –

+0

लेकिन संकलक जानता है कि बिल्ली फर्नीचर लागू नहीं करती है, और वह रन टाइम पर नहीं बदल सकती है? मुझे एक साधारण बिंदु याद आ रहा है, लेकिन आपका जवाब वास्तव में – enp4yne

+0

की मदद नहीं करता है। हालांकि बिल्ली सीधे फर्नीचर को लागू नहीं कर सकता है, बिल्ली के कुछ सुपरक्लास हो सकते हैं। और संकलक इस तरह के बदसूरत विवरण में खोदना नहीं चुनता है, क्योंकि इंटरफेस के नियम बहुत ही मजबूत हैं। (धन्यवाद, सूर्य।) और कोई सामान्य नियम नहीं है * एक अनिवार्य रनटाइम अपवाद (जैसे शून्य द्वारा विभाजित) का पता लगाने के लिए कंपाइलर की आवश्यकता है - यह एक "सेवा" प्रदान करता है जो यह प्रदान करता है। –

उत्तर

12

कारण यह संकलित

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 

है आप बहुत अच्छी तरह से

public class CatFurniture extends Cat implements Furniture {} 

आप एक CatFurniture उदाहरण बनाते हैं, तो आप इसे Cat cat को असाइन कर सकते हो सकता है और कहा कि उदाहरण हो सकता है Furniture पर डाला गया। दूसरे शब्दों में, यह संभव है कि कुछ Cat उप प्रकार Furniture इंटरफ़ेस को कार्यान्वित करता है।

अपने पहले उदाहरण में

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

यह है कि कुछ Cat उप प्रकार फैली Chair जब तक Cat ही Chair तक फैली हुई है असंभव है।

+4

यह ध्यान रखना उपयोगी है कि अगर 'बिल्ली' को 'अंतिम' घोषित किया गया था, तो संकलक वास्तव में शिकायत करेगा (यह पता चलेगा कि 'बिल्ली' का कोई उप-वर्ग 'फर्नीचर' लागू नहीं कर सकता है 'बिल्ली' का कोई उप-वर्ग नहीं हो सकता है)। –