2013-07-13 5 views
0

Я новичок в java и при попытке ответить на вопрос what is the output.Почему этот интерфейсный экземпляр дает ошибку при ссылке на экземпляр класса, который реализует этот интерфейс.

Эта строка InterfaceB obj = new ClassA(); дает ошибку, а другие нет.

Я знаю, что переменная суперкласса может ссылаться на переменную подкласса, аналогичную интерфейсу. Но что происходит в этом случае. Я хочу знать, что происходит за увиденным.

interface InterfaceA { void methodA(); } 

interface InterfaceB extends InterfaceA { void methodB(); } 

class ClassA implements InterfaceA 
{ 
    public void methodA() {} 
    public void methodB() {} 
} 

class ClassB extends ClassA implements InterfaceB 
{ 
    public ClassB() {} 
    // InterfaceA obj = new ClassA(); no error 
    InterfaceB obj = new ClassA(); //give error: incompatible types 
    // InterfaceA obj = new ClassB(); no error 
    // InterfaceB obj = new ClassB(); no error 
     // ClassA obj = new ClassB(); no error 
} 

public class Online4 { 
    public static void main(String args[]) { 
     ClassB b = new ClassB(); 
    } 
} 

ответ

3

Вы получаете эту ошибку, потому что ClassA не реализует интерфейс B.

Всегда помните, что в Java родительского типа может ссылаться на подтип.

Тип IntefaceB не имеет отношения к типу ClassA здесь. И ниже, чтобы работать

InterfaceB obj = new ClassA(); 

ClassA должны иметь свой родительский тип быть InterfaceB (либо непосредственно, либо anyother типа, который реализует InterfaceB (класс) или расширяет InterfaceB (интерфейс).

+0

Я пропустил, что InterfaceA является родителем в иерархии, а InteraceB и ClassA похожи на братьев и сестер. – netsmertia

1

ссылки Интерфейс может содержать ссылку на объекты, implenting этого интерфейса в вашем случае ваш CLASSA не реализации interfac B, следовательно, вы получаете сообщение об ошибке по адресу:..

InterfaceB obj = new ClassA(); 

во всех остальных комментировали случаи в вашем коде ссылку интерфейса используется фактическое удерживая объект класса (child/parent), который реализует этот интерфейс.

1

Интерфейс содержит поведение, которое реализует класс.

В вашем случае ClassA не реализует интерфейс B.

InterfaceB obj = new ClassA(); //give error: incompatible types 

, чтобы сделать эту линию работы вы можете расширить свой interfaceA с interfaceB

interface InterfaceA extends InterfaceB 

Теперь

InterfaceB obj = new ClassA(); //compiles 

вы делаете наоборот. где InterfaceB является родителем InterfaceA.

1

Для того, чтобы указать цепочку наследования ясно:

1) InterfaceB является дочерним Interface A

2) класса А является дочерним Interface A

3) Класс B является дочерним Интерфейс B и класс A (и, следовательно, интерфейс A)

Тип родительской переменной (интерфейс или класс) может содержать дочерний экземпляр (класс). Все, что находится за пределами этого, выдает ошибку.

Смежные вопросы