在Java 5中引入泛型的原因

use*_*332 1 java generics

有人能解释一下Java中引入泛型的原因吗?

据我所知,它们的介绍使您不会意外地将错误类型的对象添加到集合中.

我有点像收集的泛型,但不知道为什么它们也被添加到其他类.我见过一些让你的头部疼痛,眼睛流血的通用课程.

那么泛型的所有原因是什么(主要是非收集)?

TIA!

cyb*_*org 10

基本上类型安全和方便.

Java通过称为类型擦除的机制实现其泛型,它在编译时有效地用非泛型定义替换泛型定义.这样做的原因是为了保持API兼容性在1.4和1.5之间 - 集合API可能已经更新,但是如果你在1.5中以非通用方式访问它,它将工作相同.

不同之处在于,如果您希望集合仅包含特定类型的对象,则可以在API中明确地编码该需求,并避免诸如接收包含错误类型对象的列表之类的问题 - 以及必须明确表达的必要性转换这些对象使您的代码更易于阅读并且更不容易出错.

您将使用泛型的原因与它们与集合一起使用时的原因基本相同 - 当您需要说对象是其他对象的组合时,但是对于该组合​​可能存在一系列类型并且一旦绑定添加这些新对象意味着新的复合类型与其他类似的复合材料不同.也就是说,字符串列表在类型上与整数列表类似,但它们不再相互兼容.

这方面的一个例子是Future你在等待异步结果.本Future类封装了异步结果的概念,但具体类型Future,如Future<String>futher指定你可以期望什么样的结果-并使其不同于Future<Integer>.


And*_*s_D 6

从Java的角度来看,Java Collection Framework并不特别,因此没有理由或者只需要为此框架添加新的语言功能.

从用户的角度看泛型:现在,如果你有一个集合,你就知道它里面有什么类型的对象.这是一个很大的优势.只需比较以下代码段,不使用和使用泛型:

使用Java 1.5+

List<Animal> zoo = new ArrayList<Animal>();
for(Animal animal:zoo) {
  feed(animal);
}
Run Code Online (Sandbox Code Playgroud)

在Java 1.5之前 -

List zoo = new ArrayList();
for (int i = 0; i < zoo.size(); i++) {
  if (!(zoo.get(i) instanceof Animal)) {
    continue;
  } else {
    Animal animal = (Animal) zoo.get(i);
    feed(animal);
  }
}
Run Code Online (Sandbox Code Playgroud)

从用户的角度来看,它更像是一种伤害眼球的旧式.

  • 这并没有真正回答我的问题 (2认同)