我有一个Collection<T>。我有一个实现接口UManager的TManager类,该类具有一个getCollection()方法,该方法需要返回Collection<U>,其中U是一个接口,T是一个实现U的类。

除了仅投放以外,例如return (Collection<U>)Tcoll;,是否有更正确的方法来处理此问题?

我在这里控制所有4个类/接口。我在将UManager.getCollection声明为时是错误的吗

public Collection<U> getCollection();

应该是
public Collection<? extends U> getCollection()

最佳答案

这取决于您需要对Collection进行什么操作。如果您不需要在返回的集合中放入任何东西,则使用extends参数

  public interface UInterface {

         Collection<? extends UInterface> getCollection();

  }

并完成它。如果将来您确实需要添加到集合中,将其包装在新的集合中并添加所有功能,则可以忽略性能而忽略它(编译时问题会增加运行时性能)。

但是,如果目的是返回可变集合,则可以在接口中添加类型参数:
 public interface UInterface<T extends UInterface> {

        Collection<T> getCollection();

 }

那么您的实现将是:
 public class TClass implements UInterface<TClass> {

        pubic Collection<TClass> getCollection();

 }

这种方法的问题在于,您绝对必须在运行时具有类型参数,才能使用该接口从中获取可变的集合,或者引用具体的类。

10-06 13:57