我有一个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();
}
这种方法的问题在于,您绝对必须在运行时具有类型参数,才能使用该接口从中获取可变的集合,或者引用具体的类。