适用于泛型类型列表的正确类型签名?

时间:2014-07-03 05:10:01

标签: java generics

我是否被迫在我的情况下使用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,这似乎打败了在该课程中使用泛型的目的。

1 个答案:

答案 0 :(得分:1)

您可以使用扩展SomeApp的类型简化Event泛型,然后使用该类型参数化eventsprocessors List

public class SomeApp <T extends Event> {
    public List<Processor<T>> processors; 
    public List<T> events;