【发布时间】: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 的类型没有兴趣。在我的例子中,编译时类型是未知的(我们使用反射来构造ComplicatedProducer 和Processor),我宁愿不必有一个返回Summarizer<?> 的工厂函数。是否有任何干净的方法可以使 Summarizer 成为非泛型而不使用原始类型?
【问题讨论】:
-
为什么
ComplicatedProducer是通用的?为什么不使用ComplicatedProducer<? extends Object>?Processor也是如此。 -
因为
ComplicatedProducer<T>::next()返回T而Processor<T>::process将T作为参数。实际的方法比这更复杂,对它们的交互进行类型检查很有用。