Java> = 8 вызывать метод по умолчанию для интерфейса в статическом контексте с instanceof? - PullRequest
1 голос
/ 26 октября 2019

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

interface InterfaceWithDefaultMethod{  
   public default void saySomething(final int a,final int b){System.out.println(String.format("Parameters are %d %d",a,b));}
}
public class StaticsMethodIsNotOverriden2 implements InterfaceWithDefaultMethod {
   public static void main(String[] args) {
      final StaticsMethodIsNotOverriden2 clazz = new StaticsMethodIsNotOverriden2();
      clazz.saySomething(13,20);//Overriden method call with 13 20
      clazz.callDefaultSaySomethingFromInstance();//Parameters are 1 2        
      /*HOW CALL public default void saySomething(final int a,final int b) METHOD HERE....????*/
      clazz.InterfaceWithDefaultMethod.super.saySomething(1, 2);/*no enclosing instance of type InterfaceWithDefaultMethod is in scope*/        
   }    

   @Override
   public void saySomething(int a, int b) {
      System.out.println(String.format("Overriden method call with %d %d",a,b));
   }
   //THIS IS WHAT A WANT TO DO BUT IN STATIC CONTEXT...
   private void callDefaultSaySomethingFromInstance(){
      InterfaceWithDefaultMethod.super.saySomething(1, 2); /*CALLING DEFAULT METHOD FROM INSTANCE CONTEXT*/       
   }
}

Можно вызвать метод по умолчанию InterfaceWithDefaultMethod-> saySomething из методастатический контекст с использованием экземпляра StaticsMethodIsNotOverriden2 ??

Извините, если вопрос прост.

Это не работает.

1 Ответ

5 голосов
/ 26 октября 2019

Нет. Метод default является методом экземпляра, и в этом случае сработает динамическое связывание. Для клиента переопределенного метода не существует конструкции , которая бы вызвала вызов супер-реализации. Это можно сделать только из подкласса (как вы делали это в callDefaultSaySomethingFromInstance)

Единственный вариант - предоставить другой метод в подклассе и заставить этот метод вызывать метод по умолчанию для реализованного интерфейса:

class StaticsMethodIsNotOverriden2 implements InterfaceWithDefaultMethod {
    public static void main(String[] args) {
        ...
        clazz.superSaySomething(1, 2);
    }

    //a different name/signature needed
    public void superSaySomething(int a, int b) {
        System.out.println(String.format("Forcing super method call with %d %d", a, b));
        //the subclass calls default method
        InterfaceWithDefaultMethod.super.saySomething(a, b); 

    }

    @Override
    public void saySomething(int a, int b) {
        System.out.println(String.format("Overriden method call with %d %d", a, b));
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...