我只是不明白这一点.
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:
我只是重温上述内容并仍然感到困惑.
由于编译器允许以下内容:
List a = new ArrayList();
List <?> b = a;
List <? extends Object> c = a; // with warning of course
for (Object obj : b) {}
// I don't agree with your statements above that <?> cannot be
// written in the for (:) loop as shown here
for (Object obj : c) {}
Run Code Online (Sandbox Code Playgroud)两者都是允许的.因此,我仍然不明白为什么在分配原始时未经检查的警告<? extends Object>
如果我的想法正确,那么默认情况下编译器会假设你的意思是这个
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)
你限制了它的范围。由于您限制了范围,因此您会收到警告。是的,我知道你不认为你是,但对编译器来说你是。如果你绝对确定你知道自己在做什么,就忽略它或压制它