Java 类型的 "internal" 泛型的模式

Pattern for Java generics for "internal" type

我有一个class。它的 public 接口(不包括构造函数)不是泛型的,但它的内部逻辑是。一个简化的例子是:

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),我宁愿不必有一个 returns 的工厂函数Summarizer<?>。有什么干净的方法可以在不使用原始类型的情况下使 Summarizer 非泛型吗?

您始终可以拥有单级包装器:

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));
   }
}