您的问题最令人困惑的方面是您必须使用泛型类型与经典原始类型进行的基础心理转换.
在Generics之前,每个变量都有一个确定的类型,例如Object.虽然你可以为它分配一个String,但是一个String仍然是一个Object,所以范例保持在所有情况下你将一个Object分配给一个Object var.
泛型不是这样.你可能有一个List,可以从一系列类型中分配,这些类型与声明的变量类型没有关系,但只满足某种模式.该模式由通配符描述.
因此,为了在推理泛型变量类型时让生活更轻松,您需要放弃简单而舒适的明确类型概念,并根据这些“类型模式”进行思考.
至于你问题的第二部分:List< User>和列表< Admin>无论User和Admin是否相关,都是完全不相关的类型.这就是Generics的工作原理,并且有充分的理由. Java不允许您将OrdinaryUser添加到List< Admin>,并且假设可能发生:
List users = new ArrayList();
users.add(new OrdinaryUser()); // shouldn't be allowed!
官方术语是泛型类型在其类型参数方面是不变的.最好是谷歌这个词,因为它已经很好地涵盖.