【问题标题】:Pattern for Java generics for "internal" type“内部”类型的 Java 泛型模式
【发布时间】:2022-01-04 20:53:02
【问题描述】:

我有课。它的公共接口(不包括构造函数)不是通用的,但它的内部逻辑是通用的。一个简化的例子是:

class Summarizer<T> {
  private final ComplicatedProducer<T> producer;
  private final Processor<T> processor;

  StreamSummarizer(ComplicatedProducer<T> producer, Processor<T> processor) {
     ...
  }

  public int summarizeAll() {
    int sum = 0
    // some business logic goes here
    for (...) {
      sum += processor.process(producer.next());
    }
    return sum;
  }

  public int summarizeSomePortion(Parameters p) {
    // some other business logic goes here
    ...
  }
}

注意(构造后)Summarizer 的用户对T 的类型没有兴趣。在我的例子中,编译时类型是未知的(我们使用反射来构造ComplicatedProducerProcessor),我宁愿不必有一个返回Summarizer&lt;?&gt; 的工厂函数。是否有任何干净的方法可以使 Summarizer 成为非泛型而不使用原始类型?

【问题讨论】:

  • 为什么ComplicatedProducer 是通用的?为什么不使用ComplicatedProducer&lt;? extends Object&gt;Processor 也是如此。
  • 因为ComplicatedProducer&lt;T&gt;::next() 返回TProcessor&lt;T&gt;::processT 作为参数。实际的方法比这更复杂,对它们的交互进行类型检查很有用。

标签: java generics types


【解决方案1】:

你总是可以有一个单层包装器:

class SummarizerImpl<T> {
    private final ComplicatedProducer<T> producer;
    private final Processor<T> processor;

    SummarizerImpl(ComplicatedProducer<T> producer, Processor<T> processor) {
      ...
    }
}

class Summarizer {
   private final SummarizerImpl<?> impl;
   private Summarizer(SummarizerImpl<?> impl) { ... }
   public static <T> Summarizer create(
       ComplicatedProducer<T> producer, Processor<T> processor) {
     return new Summarizer(new SummarizerImpl<T>(producer, processor));
   }
}

【讨论】:

  • 这里发生的事情是我们抽象了 Summarizer 要做的 SummarizerImpl 的工作吗?是否为 Summarizer 创建工厂方法?我是 Java 新手,我只是想弄清楚问题中的原始方法去了哪里。
  • 两者都需要; Summarizer 只会调用SummarizerImpl
  • 我可以要求一个具体的例子,如果有一个现成的,类似的结构?我想尝试运行代码并自己修改它以更好地了解正在发生的事情,但我需要一些具体的东西。当然,我会尝试使用这里已有的代码,但我认为我仍然需要一些指导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多