为什么我用这个Java代码会出现编译器错误?
1 public List<? extends Foo> getFoos()
2 {
3 List<? extends Foo> foos = new ArrayList<? extends Foo>();
4 foos.add(new SubFoo());
5 return foos;
6 }Run Code Online (Sandbox Code Playgroud)
其中'SubFoo'是实现Foo的具体类,而Foo是一个接口.
我用这段代码得到的错误:
更新:感谢Jeff C,我可以更改第3行来说"new ArrayList <Foo>();".但我仍然遇到第4行的问题.
我之前遇到过一些我在Java中没有遇到过的东西,也就是说,我需要在运行时创建一个新的ArrayList类实例而不分配已知类型然后将数据添加到列表中.这听起来有点模糊,所以这是一个例子:
Class<?> c = i.getClass();
Constructor<?> con = ArrayList.class.getConstructor();
ArrayList<?> al = (ArrayList<?>)con.newInstance();
al.add("something");
Run Code Online (Sandbox Code Playgroud)
现在我这样做而不仅仅使用泛型的原因是因为泛型已经被大量使用而且这个例子中的"i"变量将被用作类型"?".我真的不想投入另一个通用,因为这会给用户带来更多的工作,并且在最终设计中会更不灵活.有没有办法使用下面的东西(注意:下面的内容不起作用).有人有想法吗?
ArrayList<c> al = (ArrayList<c>)con.newInstance();
Run Code Online (Sandbox Code Playgroud) 好的,所以这是我的问题:
我有一个包含接口的列表List<Interface> a- 以及扩展该接口的接口列表:List<SubInterface> b.我想设置a = b.我不想使用addAll()或任何会花费更多内存的东西,因为我正在做的事情已经非常耗费成本.我真的需要能够说出来a = b.我试过List<? extends Interface> a,但后来我不能将接口添加到列表中a,只能添加SubInterfaces.有什么建议?
编辑
我希望能够做到这样的事情:
List<SubRecord> records = new ArrayList<SubRecord>();
//add things to records
recordKeeper.myList = records;
Run Code Online (Sandbox Code Playgroud)
RecordKeeper类是包含接口列表(NOT子接口)的类
public class RecordKeeper{
public List<Record> myList;
}
Run Code Online (Sandbox Code Playgroud)
另一个编辑:
我发布了我的工作解决方案.我感谢所有回答的人,并为显然让我的问题如此混乱而道歉.