首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java重写方法,该方法具有泛型类型参数,并在调用时对其进行类型转换

Java重写方法,该方法具有泛型类型参数,并在调用时对其进行类型转换
EN

Stack Overflow用户
提问于 2019-04-07 14:46:51
回答 2查看 85关注 0票数 1

我有一个已经弃用的实用类OldRemote,但在新的类NewRemote稳定之前,它仍然会被使用一段时间。这两个实用程序类具有相同的方法名称和参数,但返回类型pojo类不同。即使返回类型pojo结构是相同的,但命名是不同的。

简单地说,这两种函数返回类型都是具有不同字段名的pojo类型。

在下面的用例中,有什么通用的方法来处理这个问题吗?

我已经创建了一个服务接口,它具有新旧类的泛型方法契约。

代码语言:javascript
运行
复制
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类

代码语言:javascript
运行
复制
public class OldRemote implements RemoteService{
    @Override
    public OldPojo turnOnTV() {
        OldPojo oldPojo = new OldPojo();
        System.out.println("OldPojo");
        return oldPojo;
    }
}

NewRemote类

代码语言:javascript
运行
复制
public class NewRemote implements Service{
    @Override
    public NewPojo turnOnTV() {
        NewPojo newPojo = new NewPojo();
        System.out.println("NewPojo");
        return newPojo;
    }
}

上述实现的演示用法。

代码语言:javascript
运行
复制
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()的所有地方都进行类型转换。即使我不得不这样做,我也必须编写一个条件来在OldPojoNewPojo之间切换,无论turnOnTV()是在哪里被调用的。

有没有办法解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2019-04-07 15:01:02

您可以创建一个基类或接口,它们都可以扩展/实现。

代码语言:javascript
运行
复制
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();
    } 
}

只有在您知道服务类型的情况下,这才会起作用。否则,您将像预期的那样使用通用泛型类型。

票数 0
EN

Stack Overflow用户

发布于 2019-04-07 21:56:32

我们可以使用以下方法来处理此问题:

1)我们可以在一个公共位置创建一个虚拟的POJO类,将OldPojo和NewPojo的引用都作为数据成员

代码语言:javascript
运行
复制
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的对象:

代码语言:javascript
运行
复制
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()使用,如下所示:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55556337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档