Java泛型主要是一种强制集合元素的静态类型的方法吗?

Har*_*nce 5 java generics

private ArrayList<String> colors = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

看看上面的例子,泛型的主要观点是在集合上强制执行类型.因此,我没有在程序员自行决定的情况下将一个"对象"数组转换为字符串,而是在ArrayList中对集合强制执行"String"类型.这对我来说是新的,但我只想检查一下我是否正确理解它.这种解释是否正确?

Joa*_*uer 8

到目前为止,这不是泛型的唯一用途,但绝对是最明显的.

泛型可以(并且)在许多不同的地方使用,以确保静态类型安全,而不仅仅是集合.

我只想提一下,因为你会遇到泛型可能有用的地方,但是如果你坚持使用泛型/收藏协会,那么你可能会忽略这一事实.

  • 我想回答这个问题.大多数开发人员将首先在集合类中面对java泛型.这是泛型肯定会对编译时类型检查做出重大改进的地方.但是,一旦你在泛型中思考,就会出现很多模式.例如工厂方法,如public <T> T createInstance(Class <?extends T> klass)和类似.通常大多数时候你现在进行强制转换,使用泛型,你可以用类型安全表达式替换这个强制转换. (5认同)

pou*_*def 1

是的,基本上就是这样。在泛型出现之前,必须创建一个对象的 ArrayList。这意味着可以将任何类型的对象添加到列表中 - 即使您只想让 ArrayList 包含字符串。

泛型所做的就是添加类型安全。也就是说,现在 JVM 将确保列表中的任何对象都是 String,并阻止您将非 String 对象添加到列表中。更好的是:此检查是在编译时完成的。

  • 请注意,它们实际上并没有在运行时添加类型安全,只是在编译时添加。这些类型在运行时被丢弃,任何事情都可能发生。泛型仅用于文档/清晰度和编译时检查。 (3认同)
  • 在不破坏与现有代码的兼容性的情况下添加具体化泛型是不可能的。Neal Gafter 在这里非常彻底地解释了这一点:http://gafter.blogspot.com/2006/11/reified-generics-for-java.html (2认同)