我的代码是:
List<? super myclass> test_list = new ArrayList<Object>();
....
myclass m;
m = test_list.get(i);
并获得编译错误
MixedLists.java:43: error: incompatible types
m=test_list.get(i);
^
required: myclass
found: CAP#1
where CAP#1 is a fresh type-variable:
CAP#1 extends Object super: myclass from capture of ? super myclass
1 error
答案 0 :(得分:0)
简而言之,Object不是myclass:myclass extends Object,i.o.w.,Object是myclass的超类。
如果你有
List<? extends myclass> test_list = new ArrayList<Object>();
您的编译失败。如果你有
List<Object> test_list = new ArrayList<myclass>();
它会编译,但你需要显式演员。你所拥有的(如果你眯着眼睛)就像:
List<Object> test_list = new ArrayList<Object>();
因为List<Object>
(可能)比List<? super myclass>
更通用(如果myclass不扩展任何其他类,它可能基本相同)。
这样可以正常工作:
List<? extends myclass> test_list = new ArrayList<myclass>();
答案 1 :(得分:0)
您已明确声明该列表属于myclass
的超类型的某种类型:
List<? super myclass> test_list = new ArrayList<Object>();
鉴于列表可能包含类型为myclass
的超类型的项目,您无法将这些项目分配给myclass
类型的变量。也许,正如泰勒的评论所暗示的那样,你真的想要使用&#39; extends&#39;:
List<? extends myclass> test_list = new ArrayList<myclass>();