2016-06-28 1 views
1

Я использую Interface для CallBack (оба из которых я очень новенький). До сих пор все мои CallBacks имели один и тот же тип элемента, но теперь я хочу вернуть другой тип элемента.Есть ли альтернатива методам перегрузки в интерфейсе?

Текущая ситуация:

public interface CallBack { 
    void CallBack(String s) 
} 

То, что я думал, что будет работать:

public interface CallBack { 
    void CallBack(String s) 
    void CallBack(Integer i) 
} 

Это (очевидно, для большинства из вас) говорит мне, что я должен реализовать оба метода, когда с помощью CallBack, который не мое предназначение.
Я знаю, что смогу «исправить» это сейчас, изменив его на void CallBack(Object o), но мне не нравится двусмысленный тип и хотелось бы сделать его более прочным.

Есть ли способ, что я могу сделать это так, мой CallBackOverride выглядит следующим образом:

...new CallBack() { 
    @Override 
    public void CallBack(String s) { 
     ... 

... или ...

...new CallBack() { 
    @Override 
    public void CallBack(Integer i) { 
     ... 

... вместо того, чтобы реализовать оба , или используя вариант Object?

+1

no, как код, который получает обратный вызов, даже знает, какой тип вы хотите, когда все, что он видит, является интерфейсом 'CallBack'. PS: есть ли reaons не иметь несколько разных обратных вызовов? 'StringCallback',' IntCallback', ...? – zapl

+0

Что именно вы подразумеваете под «получением обратного вызова»? Переопределенный метод знал бы, очевидно, так как вы пишете это сами, а место, где вы «вызываете» (?) Это, может знать, так как вы полагаете этот тип, я думаю? ('CallBack.CallBack ("SomeString");'). Как я уже сказал, я очень новичок в этом – Timmiej93

+1

Вы имеете в виду сделать его общим? Вы могли бы это сделать. –

ответ

7

Вы можете использовать общий интерфейс, как показано ниже

public interface CallBack<T> { 
    T CallBack(T s); 
} 

и использовать его как следовать

new CallBack<String>() { 

      @Override 
      public String CallBack(String s) { 
       // TODO Auto-generated method stub 
       return null; 
      } 

     }; 

или

new CallBack<Integer>() { 

      @Override 
      public Integer CallBack(Integer s) { 
       // TODO Auto-generated method stub 
       return null; 
      } 


     }; 
+0

Я думаю, что это лучший ответ для меня (на данный момент), похоже, работает так, как я этого хочу. Спасибо, сэр (или мадам)! – Timmiej93

+0

Сэр :). Пожалуйста ! –

+1

@ Timmiej93 Обратите внимание, что если вы придерживаетесь одного метода интерфейса, у вас есть [функциональный интерфейс] (https://dzone.com/articles/introduction-functional-1), что означает, что вы можете использовать чистую лямбда синтаксис в Java 8. Ваш интерфейс также функционально эквивалентен встроенному ['Consumer'] (https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html) класс, если вы придерживаетесь типа возврата 'void'. Если вы используете 'T' в качестве возвращаемого типа, это эквивалентно [' UnaryOperator'] (https://docs.oracle.com/javase/8/docs/api/java/util/function/UnaryOperator.html) , – shmosel

-2

вы должны сделать свой интерфейс, общий интерфейс, указав общий типа, как показано ниже:

public interface Callback<T>{ 
    T callback(T t); 
} 

и ваши конкретные реализации будет выглядеть следующим образом:

public class StringCallback implements Callback<String>{ 
    String callback(String string){ 
    //TODO: provide your implementation here. 
    } 
} 

так же, как вы можете реализовать свою версию Integer.