我可以声明一个可以生成和使用的接口对象集合吗?
我有一个界面:
public interface IData {
…
}
一个实现它的类
public class WristMonData implements IData{
…
}
我想声明一个实现该接口的对象列表以传递给方法。我似乎无法使收集声明正确。
IData works = new WristMonData();
List<IData> doesntWork = new ArrayList<WristMonData>(); //Incompatible types error
我的理解是我不应该使用List<? extends IData>
或List<? super IData>
,因为我需要生成和使用列表。
答案 0 :(得分:1)
您需要声明
List<IData> itWorks = new ArrayList<IData>();
然后,您可以将类型WristMonData
的元素添加到列表
答案 1 :(得分:1)
你可以写:
List<WristMonData> doesWork = new ArrayList<WristMonData>();
这可以传递给带签名的方法:
public void method(List<? extends IData> list)
如果使用? extends
,则无法将非null元素添加到方法正文中的列表中。一个好的解决方法是使用私有通用辅助方法。
public void method(List<? extends IData> list) {
helper(list);
}
private <T extends IData> void helper(List<T> list) {
// You can use list as both a consumer and supplier of Ts here.
}