为什么List <! - 需要显式强制转换?超级myclass - >?

时间:2014-09-09 15:15:08

标签: java super

我的代码是:

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

2 个答案:

答案 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>();