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