生到<?extends Object>

yap*_*m01 11 java generics

我只是不明白这一点.

List list = new ArrayList();
List <? extends Object> list1 = list; // unchecked conversion warning.
Run Code Online (Sandbox Code Playgroud)

由于Object是Java中最高的上限,我没有看到任何理由为什么会出现警告.

更新1:

关于akf的答案:

我完全理解你在说什么.我已经知道了.但< ? extends Object>是最高的上限.这意味着你有任何你想要的类型.基本上<?> == <? extends Object>.

你可以在你的代码上试试这个,你会看到 <?> == <? extends Objects>

更新2:

关于盛的答案:

List  list = new ArrayList ();
List.add("a");
List <? extends Runnable> list1 = list; //warning here
Run Code Online (Sandbox Code Playgroud)

为什么没有警告?

List <?> list2 = list; // No warning here
Run Code Online (Sandbox Code Playgroud)

更新3:

我只是重温上述内容并仍然感到困惑.

由于编译器允许以下内容:

  1. List a = new ArrayList();

  2. List <?> b = a;

  3. List <? extends Object> c = a; // with warning of course

    for (Object obj : b) {}
    // I don't agree with your statements above that &lt;?&gt; cannot be 
    
    // written in the for (:) loop as shown here
    for (Object obj : c) {}
    
    Run Code Online (Sandbox Code Playgroud)

两者都是允许的.因此,我仍然不明白为什么在分配原始时未经检查的警告<? extends Object>

The*_*eLQ 1

如果我的想法正确,那么默认情况下编译器会假设你的意思是这个

List<?> list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

这 ?意味着你可以拥有任何你想要的泛型类型。这就是为什么

List list = new ArrayList();
List <?> list2 = list
Run Code Online (Sandbox Code Playgroud)

有效,因为对于编译器来说它们是相同的东西

然而,当你这样做时

List<?> list = new ArrayList();
List<? extends Object> list2 = list
Run Code Online (Sandbox Code Playgroud)

你限制了它的范围。由于您限制了范围,因此您会收到警告。是的,我知道你不认为你是,但对编译器来说你是。如果你绝对确定你知道自己在做什么,就忽略它或压制它