2016-04-10 13 views
10

Eğer instanceof operatörünü yanlış bir sınıfla kullanmaya çalışırsam derleme hatası alıyorum ("Hayvan String'e dönüştürülemez") ama bir arabirim ile derleme zamanı hatası almıyorum.instanceof arabirimiyle

Örneğin: Satır 10 Bir derleme hatası alıyorum çünkü Hayvan bir Dize alt sınıfı değil. Ama hat 14'te Hayvan listeleme arayüzünü uygulamamasına rağmen bir derleme hatası alamıyorum.

class Animal { 

} 

public class InstanceOf { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if (a instanceof String){ //line 10 
      System.out.println("True"); 
     } 

     if (a instanceof List){ //line 14 
      System.out.println("True"); 
     } 
    } 

} 
+0

Lütfen sorunuzdaki tam hata mesajını ekleyin. –

+0

Bunu göz önünde bulundurun: B sınıfı, Hayvan uygulamaları Listesini genişletir. Şimdi bu: 'Hayvan a = yeni B();' – njzk2

+0

@Tunaki Ayrıca "Dupehammer®" var - neden kapatmadınız? (Muhtemelen: Benim gibi tereddütlüyorsun ...: - /) – Marco13

cevap

18

a bir instanceof String, dolayısıyla derleme hatası olamaz. Animal bazı alt sınıf List arabirimini uygulayacağını ve a böyle alt sınıfının bir örneğini atamak olsaydı

aList bir örneği olabilir. Bu nedenle derleyici bunu sağlar. JLS kaynaktan

:

ReferenceType için RelationalExpression bir döküm (§15.16) bir derleme hatası olarak reddedilecektir, o zaman instanceof ilişkisel ifade aynı şekilde bir derleme hatası üretir. Böyle bir durumda, instanceof ifadesinin sonucu asla doğru olamazdı.

+1

java izin verilmiyor birden fazla kalıtım kök neden mi? Aynı zamanda herhangi bir alt sınıf istediği zaman bir Arayüz uygulayabilir mi? – nantitv

+3

@nantitv Evet. Hayvan bir Dize alt sınıfı olmadığından, Hayvan'ın herhangi bir alt sınıfı bir Dize alt sınıfı olamaz. Spesifik snippet'inizde olmasına rağmen, dize nihai olduğundan ve alt sınıfa alınamadığından, birden çok devralmaya izin verse bile, bu bir fark yaratmaz. – Eran

+0

Teşekkürler. String Sadece bir örnek için aldım. – nantitv

1

Bu sorudan yaptığım bir deneme. Animal olarak @Eran söyledi Yani olarak

class Animal {} 
interface AnimalA {} 
class AnimalB{} 

class AnimalC extends Animal,AnimalB {} //not possible 
class AnimalD extends Animal implements AnimalA{} //possible 

public class InstanceOfTest { 

    public static void main(String[] args) { 
     Animal a = new Animal(); 
     if(a instanceof AnimalA) { //no compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof AnimalB) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof List) { //compile time error 
      System.out.println("interface test"); 
     } 
     if(a instanceof ArrayList) { //compile time error 
      System.out.println("interface test"); 
     } 
    } 
} 

, onun haline gelebilir alt sınıf ve AnimalB örneğinin AnimalB olmayan bir alt sınıf değil. Ama diğer alt sınıfın herhangi birinde interface List'i uygulayabilirsiniz.

İlgili konular