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
的类型不感兴趣。在我的例子中,类型在编译时是未知的(我们使用反射来构造 ComplicatedProducer
和 Processor
),我宁愿不必有一个 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));
}
}
我有一个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
的类型不感兴趣。在我的例子中,类型在编译时是未知的(我们使用反射来构造 ComplicatedProducer
和 Processor
),我宁愿不必有一个 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));
}
}