ClassCastException при попытке конвертировать интерфейсы

Мне нужна помощь в понимании того, почему я получаю ClassCastException при попытке преобразовать ParentInterface в ChildInterface.

Пример кода

{ParentInterface P1}

{SampleClass P2 implements P1}

{ChildInterface C1 extends P1}

SampleClass sampleClass = new SampleClass();
ChildInterface childI = (ChildInterface) sampleClass;

Если быть точным, что я делаю [Реализация вышеуказанной логики]:

getInterface(){
return (ChildInterface)ParentInterfaceHelper.INSTANCE;
}

private static class ParentInterfaceHelper {
    private static final ParentInterface INSTANCE;
    static{
     INSTANCE = new SampleClass();
    }

}

я получаю сбои во время выполнения с исключениями

Исключение в основном потоке java.lang.ClassCastException:

Мое понимание:

Это исключение связано с тем, что я создаю объект, который реализуется ParentClass, поэтому ссылка относится к ParentInterface, а не к ChildInterface, и поэтому выполнение кода завершается сбоем во время выполнения. Я прав?


person gabru101    schedule 08.09.2020    source источник
comment
Ваше понимание правильное. SampleClass не связан с ChildInterface. Есть еще вопрос или это все, что вы хотели подтвердить?   -  person ernest_k    schedule 08.09.2020
comment
Есть ли способ, которым я могу достичь своего мотива, чтобы вернуть ChildInterface?   -  person gabru101    schedule 08.09.2020
comment
Не без того, чтобы SampleClass реализовать ChildInterface   -  person ernest_k    schedule 08.09.2020
comment
Что-то вроде: открытый класс SampleClass реализует ParentInterface, ChildInterface?   -  person gabru101    schedule 08.09.2020
comment
Просто нужно объявить implements ChildInterface, поскольку ChildInterface уже расширяет ParentInterface.   -  person ernest_k    schedule 08.09.2020


Ответы (1)


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

В вашем примере SampleClass реализует только ParentInterface, а не ChildInterface. Вы можете позволить SampleClass реализовать ChildInterface, и он также будет неявно реализовывать ParentInterface. Вы также можете добавить различные интерфейсы.

class SampleClass implements ChildInterface1, ChildInterface2

public class ParentInterfaceHelper {
    private static final SampleClass INSTANCE;
    static{
     INSTANCE = new SampleClass();
    }

    public static ParentInterface getParentInterface(){
      return INSTANCE;
    }

    public static ChildInterface1 getInterface1(){
      return INSTANCE;
    }

    public static ChildInterface2 getInterface2(){
      return INSTANCE;
    }
}
person GreyFairer    schedule 08.09.2020