2013-10-02 19 views
8

Açıkçası ilgisiz bir arayüz ve sınıf Casting, bu bir derleme hatasına yol açar Birleştirilmemiş arayüze bir Cat referansı döktüm Mobilya, derleyici Cat'in Mobilya'yı uygulamadığını açıkça söyleyebilir mi?Java: Sandalye Cat ilişkili değildir, çünkü

interface Furniture {} 

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

çünkü polimorfizm çalışma zamanında gerçekleşir. –

+0

fakat derleyici, Cat'in Mobilyaları uygulamadığını ve çalışma zamanında değişemeyeceğini biliyor mu? Basit bir noktayı kaçırıyor olabilirim, ama cevabınız bana gerçekten – enp4yne

+0

yardım etmiyor. Cat, Mobilya'yı doğrudan uygulayamasa da, bazı Cat sınıfları olabilir. Ve derleyici, arayüzler için kurallar oldukça sarsılmış olduğundan, çirkin ayrıntılara girmemeyi seçiyor. (Teşekkür ederim, Sun.) Ve derleyici * kaçınılmaz bir çalışma zamanı istisnasını (sıfıra bölmek gibi) algılamak için gereken * genel bir kural yoktur - daha çok bir "hizmet" sağlar. –

cevap

12

nedeni bu

interface Furniture {} 

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

çok iyi bir CatFurniture örneği oluşturursanız, Cat cat atayabilirsiniz

public class CatFurniture extends Cat implements Furniture {} 

sahip olabilmesidir derler ve o örneği olabilir Furniture'a dökülmüştür. Başka bir deyişle, Cat alt türünün Furniture arabirimini uyguladığı olasıdır. İlk örnekte

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

kendisini Chair uzanır ChairCat sürece bazı Cat alt tipi uzanan imkansız.

+4

Eğer 'Cat'' 'final' olarak ilan edildiğinde, derleyici gerçekten şikayet edecekti (' '' '' '' "Kedi" nin alt sınıfı olamazdı. –