【问题标题】:Transform array of generic objects into an array of another generic class将泛型对象数组转换为另一个泛型类的数组
【发布时间】:2014-07-18 20:23:42
【问题描述】:

我正在寻找一种将一种泛型类型的数组转换为另一种的方法。这是我的用例:

我有一个包含以下 Composite 的基础库:

// leaf
public interface Job<T extends JobResult> {
  public T doJob();
}

public class CompositeJob<T extends JobResult> implements Job<T>{
  private Job<T>[] jobs;
  // ...
}

// component
public interface Worker<T extends JobResult> {
  public T doWork();
  public Job<T>[] getJobs();
  public void addJob(Job<T> job);
}

public class HardWorker<T extends JobResult> implements Worker<T> {
  public T doWork() {
    // ...
  }
}

我还有一个自定义库,它可以导入基础库,它为作业使用更特定于域的名称,即“客户”。我希望我的自定义库的用户只通过我的客户类型进行交互,这样我就可以在不干扰我的公共 API 的情况下更改基础库的实现。

因为Worker.getJobs() 返回了一个Job[] 数组,所以我受阻。我想编写一个可以将Job[] 转换为WorkItem[] 的方法,以防止暴露基础库的类型,但我不确定如何用Java 编写该对话方法。

这是我想要的方法的签名:

public WorkItem<T1>[] convert(Job<T>[] jobs) {
  for (Job<T> job : jobs) {
    // convert a T to a T1
    // create a new WorkItem using the Job as input
  }
}

【问题讨论】:

  • 我们对WorkItem一无所知。
  • 我知道如何从Job 的属性中创建一个新的WorkItem

标签: java arrays generics


【解决方案1】:

我想写一个可以将Job[] 转换为WorkItem[] 的方法,以防止暴露基础库的类型。

Adapter Design Pattern 在这种情况下可能会对您有所帮助,请专门阅读对象适配器模式部分。

阅读更多Adapter Pattern - GOF

适配器模式是一种设计模式,用于允许两种不兼容的类型进行通信。如果一个类依赖于另一个类未实现的特定接口,则适配器充当两种类型之间的转换器。

【讨论】:

  • 我一直在尝试使用铸造方法,但也许适配器是要走的路。让我试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多