我是否被迫在我的情况下使用rawtypes,或者是否有某种签名我可以应用于我的类型声明,这将完全消除它们?我有一个通用接口,由一个或多个类实现。以下是相关代码的简化形式。
public class Event { ... }
public interface Processor<E extends Event> {
void process(List<E> events);
}
public class ProcessorImpl<E extends Event> implements Processor<E> {
@Override
public void process(List<E> events) { ... }
}
所以以上是相关课程,现在我将说明我的困惑。
public class SomeApp {
public List<Processor> processors; // rawtype of Processor<E extends Event>
public List<Event> events;
public SomeApp(...) { ... } // Fills the lists up
public void run() {
for (int i = 0; i < processors.size(); ++i) {
processors.get(i).process(events); // takes a list of <E extends Event>
}
}
}
所有这些代码在我的特定情况下编译和运行正常,但是如果可以的话我想避免使用原始类型。我在处理器类型的列表中尝试了通配符边界,即List<Processor<? extends Event>>
,但这总是导致我需要更改进程方法以采用通配符类型而不是通用E,这似乎打败了在该课程中使用泛型的目的。
答案 0 :(得分:1)
您可以使用扩展SomeApp
的类型简化Event
泛型,然后使用该类型参数化events
和processors
List
。
public class SomeApp <T extends Event> {
public List<Processor<T>> processors;
public List<T> events;