import java.util.List;
import java.util.ArrayList;
interface Canine {}
class Dog implements Canine {}
public class Collie extends Dog {
public static void main(String[] args){
List<Dog> d = new ArrayList<Dog>();
List<Collie> c = new ArrayList<Collie>();
d.add(new Collie());
c.add(new Collie());
do1(d); do1(c);
do2(d); do2(c);
}
static void do1(List<? extends Dog> d2){
d2.add(new Collie());
System.out.print(d2.size());
}
static void do2(List<? super Collie> c2){
c2.add(new Collie());
System.out.print(c2.size());
}
}
这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特)
据我所知,方法do1有list<?扩展dog>d2
,因此d2只能被访问,不能被修改。方法d2具有list<?super Collie>c2
,因此可以访问和修改c2,并且没有编译错误。
通用指南
您不能将猫
添加到列表<?扩展动物>
,因为您不知道这是哪种类型的列表。也可以是列表
。因此,您不想将猫
抛入黑洞
。这就是为什么不允许对以这种方式声明的列表
进行修改的原因。
类似地,当您从
列表中取出一些东西时<?超级动物>
,你不知道你会从中得到什么。您甚至可以获得对象
或动物
。但是,您可以在此列表
中安全地添加动物
。
null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。
问题内容: 与完全跳过它们相比,在类中使用通配符类型的泛型有什么优势吗? 问题答案: 有很多优点。 他们不会像使用原始类型那样产生编译器警告 它们提供了更多的类型安全性。例如,考虑是否是。如果您使用代替,则可以执行以下操作: 即使该列表仅 应 包含s。如果返回,则您将无法添加 任何 内容(除外),因为列表类型未知。 他们记录的东西与原始类型完全不同,即使用某种 未知但特定的类型进行输入 。
上限通配符下限通配符 有人能帮我理解一下吗?
根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者
我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?
问题内容: 我有一个接口将对象转换为字符串: 以及用于存储所有可用转换器的地图: 现在,我有了要转换的异构数据列表,如下所示: 但是此代码无法编译: 我应该如何更改代码? 问题答案: 您面临的问题称为通配符捕获。Java无法识别将从数据中接收的类型。尝试以两种方式中的任何一种重构代码 方法1:如下 更改您的界面 方法2: 通过类型推断来捕获通配符的Helper方法 创建如下的帮助方法, 如下调用此