Java - переопределяющий метод, который имеет универсальный параметр типа и приведение типа во время его вызова - PullRequest
1 голос
/ 07 апреля 2019

У меня есть служебный класс OldRemote, который устарел, но все еще будет использоваться некоторое время, пока новый класс NewRemote не станет стабильным.И оба служебных класса имеют одинаковые имена методов и параметры, но классы pojo возвращаемого типа различны.Даже структура pojo возвращаемого типа такая же, но именование другое.

Проще говоря, оба типа возвращаемых функций - это pojo с разными именами полей.

Есть ли какой-либо общий способ обработки этого варианта использования ниже?

Я создал интерфейс службыкоторый имеет общий контракт методов как старого, так и нового класса.

public interface RemoteService {

    //contract [ return type is object to receive all/any Pojo classes ]
    Object turnOnTV();

    static Service GetRemoteservice(boolean isOldRemote){
        if(isOldRemote){
            return new OldRemote();
        }
        return new NewRemote();
    }
}

Класс OldRemote

public class OldRemote implements RemoteService{
    @Override
    public OldPojo turnOnTV() {
        OldPojo oldPojo = new OldPojo();
        System.out.println("OldPojo");
        return oldPojo;
    }
}

Класс NewRemote

public class NewRemote implements Service{
    @Override
    public NewPojo turnOnTV() {
        NewPojo newPojo = new NewPojo();
        System.out.println("NewPojo");
        return newPojo;
    }
}

Демонстрационное использование вышеприведенной реализации.

public class DemoTvRemote {
    public static void main(String[] args) {

        RemoteService remoteService1 = RemoteService.GetRemoteservice(true);
        OldPojo oldRemote = (OldPojo) remoteService1.turnOnTV();

        RemoteService remoteService2 = RemoteService.GetRemoteservice(false);
        NewPojo shr = (NewPojo) Service2.test();
    }
}

Этот код выше работает нормально.Но проблема в том, что я не хочу печатать приведение во всех местах, где turnOnTV() используется во всей моей кодовой базе.Даже если мне придется это сделать, мне придется написать условие для переключения между OldPojo и NewPojo, где бы ни вызывался turnOnTV().

Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Мы можем справиться с этим следующим подходом:

1) Мы можем создать фиктивный класс POJO в общем месте, используя ссылку как OldPojo, так и NewPojo в качестве элементов данных

public class CommonPojo  {

     OldPojo oldPojo;
     NewPojo newPojo; 

     public void setOldPojo(OldPojo oldPojo){
         this.oldPojo=oldPojo;
      }

      public void setNewPojo(NewPojo newPojo){
         this.newPojo=newPojo;
      }

     public OldPojo getOldPojo(){
         return oldPojo;
      }

      public NewPojo getNewPojo(){
         return newPojo;
      }
    } 

2) Мы можем написать метод Utility следующим образом, который может дать объект commonpojo:

public class CommonRemote {


 public  static CommonPojo turnOnTv(Boolean isOldRemote){

    CommonPojo commonPojo = new CommonPojo  

    if(isOldRemote){
         OldPojo oldPojo =new OldPojo();
         commonPojo.setOldPojo(oldPojo);

       }else{
           NewPojo newPojo =new NewPojo();
           commonPojo.setNewPojo (newPojo);
       }

    }

}

3) Использовать этот метод как turnOnTv () следующим образом:

public class DemoTvRemote {
    public static void main(String[] args) {

       CommonPojo remote1 = CommonRemote.turnOnTv(true);
        OldPojo oldRemote = remote1.getOldPojo();

       CommonPojo remote2 = CommonRemote.turnOnTv(false);
        NewPojo newRemote = remote2.getNewPojo();

    }
}

с таким подходом с небольшими изменениями в коде. Мы можем выполнить ваше требование без какой-либо типизации.

0 голосов
/ 07 апреля 2019

Вы можете создать базовый класс или интерфейс, который они оба расширяют / реализуют.

public abstract class RemoteServiceBase<E> {
    public abstract E turnOnTv();
}

public class NewRemoteService extends RemoteServiceBase<NewRemotePojo >{
    public NewRemotePojo turnOnTv() {
         return new NewRemotePojo();
    } 
}


public class OldRemoteService extends RemoteServiceBase<OldRemotePojo >{
    public OldRemotePojo turnOnTv() {
         return new OldRemotePojo();
    } 
}

Это все равно будет работать, только если вы знаете тип услуги. В противном случае вы работаете с общим универсальным типом, как и следовало ожидать.

...