什么是Java中的泛型?

swi*_*itz 34 java oop generics data-structures

我真的不明白泛型的意义.他们做了什么,你如何使用它们?

据我所知,他们所做的只是在编译时检查返回类型而不是运行时间,以避免在抛出错误之前运行程序.这就是他们所做的一切吗?

例如:

public <Integer> int test() {
    return 'c'; //will throw error at compile instead of runtime
}
Run Code Online (Sandbox Code Playgroud)

我正在读一些关于泛型是如何随意的,你应该只使用大写字母?这有点令人困惑.

Eri*_*sch 88

泛型允许您根据您正在使用的任何类型自定义" 通用 "方法或类.例如,假设您有一个将两个数字相加的方法.为了使用类型本身,您可能必须创建此方法的多个版本.例如:

public int Add(int a, int b)

public double Add(double a, double b)

public float Add(float a, float b)
Run Code Online (Sandbox Code Playgroud)

泛型允许您创建一个为调用它的类型自定义的方法.

public T Add<T>(T a, T b)
Run Code Online (Sandbox Code Playgroud)

T 取代您使用的任何类型.

  • **除了以上答案:我们在ADT中使用泛型来确保类型安全** (2认同)
  • 具有讽刺意味的是,泛型对于数字类型来说是一个糟糕的选择,因为数学运算不是接口的一部分。因此,这是一个不好的例子。 (2认同)

mil*_*ose 9

请参阅Angelika Langer常见问题解答中的基础知识 - 这是与您可能会发现的Java泛型相关的所有内容的最佳解释.也就是说,泛型的最初主要目标是启用"打字"集合.


Chr*_*rle 5

我能想到的解释泛型的最简单方法是很好的复制粘贴比喻:

public <COPY> PASTE addTwoThings(PASTE a, PASTE b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

您指定一个类型(在该<COPY>部分中)并且 java 在整个代码块中使用这个类型,它将确保这些类型是兼容的。通过这样做,您可以避免编写:

  • 添加双整数
  • 添加两个字符串
  • 添加两个我的对象

等等。不要将它与预处理器混淆,Java 只希望给出一个类型。