【发布时间】:2020-06-17 13:23:57
【问题描述】:
在这个例子中:
import java.util.*;
public class Example {
static void doesntCompile(Map<Integer, List<? extends Number>> map) {}
static <T extends Number> void compiles(Map<Integer, List<T>> map) {}
static void function(List<? extends Number> outer)
{
doesntCompile(new HashMap<Integer, List<Integer>>());
compiles(new HashMap<Integer, List<Integer>>());
}
}
doesntCompile() 编译失败:
Example.java:9: error: incompatible types: HashMap<Integer,List<Integer>> cannot be converted to Map<Integer,List<? extends Number>>
doesntCompile(new HashMap<Integer, List<Integer>>());
^
而compiles() 被编译器接受。
This answer 解释说,唯一的区别是,与<? ...> 不同,<T ...> 允许您稍后引用该类型,但似乎并非如此。
在这种情况下<? extends Number> 和<T extends Number> 有什么区别,为什么第一个编译不出来?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
[1] Java Generic type : difference between List <? extends Number> and List <T extends Number> 似乎在问同样的问题,但虽然它可能很有趣,但它并不是真正的重复。 [2] 虽然这是一个很好的问题,但标题并不能正确反映最后一句中提出的具体问题。
-
here的解释如何?
标签: java dictionary generics arraylist jvm