当前位置: 首页 > 知识库问答 >
问题:

带有上界通配符的Java泛型

淳于思淼
2023-03-14
    null

编译,我真的不明白为什么。基本上与第1行相同的问题。IOExceptionFileNotFoundException的超类,如何将超类的成员放入此ArrayList中?

编译。与第1行相同的问题。

package javaapplication;

import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.io.FileNotFoundException;

public static void main(String[] args) {
  List<? extends Throwable> exceptions = new ArrayList<FileNotFoundException>();

  ((ArrayList<Exception>)exceptions).add(new Exception());//1
  ((ArrayList<IOException>)exceptions).add(new Exception());//2,does not compile
  ((ArrayList<IOException>)exceptions).add(new IOException());//3
  ((ArrayList<Exception>)exceptions).add(new FileNotFoundException());//4
  ((ArrayList<FileNotFoundException>)exceptions).add(new
  Exception());//5,does not compile
}

共有1个答案

东郭海阳
2023-03-14

这就是为什么您会得到“不安全强制转换”编译器警告--因为它不安全。

你所有问题的答案都是:

  1. 当您强制转换列表时,它被视为该调用的类型
  2. 将错误类型放入列表时不会出现异常,但将该对象从列表中取出并赋给列表类型的变量时会出现ClassCastException
 类似资料:
  • 根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者

  • 我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?

  • 上限通配符下限通配符 有人能帮我理解一下吗?

  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个

  • 这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 据我所知,方法do1有,因此d2只能被访问,不能被修改。方法d2具有,因此可以访问和修改c2,并且没有编译错误。 通用指南