【问题标题】:What are Generics in Java? [closed]Java中的泛型是什么? [关闭]
【发布时间】:2011-10-19 01:12:17
【问题描述】:

我不太明白泛型的意义。它们是做什么的,你如何使用它们?

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

例如:

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

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

【问题讨论】:

  • 这是不正确的 - 您不能将原语用作泛型。
  • 您确实意识到,无论是否存在泛型,返回类型总是在编译时检查。你在这里所做的只是通过返回一个“c”(即 ASCII 值 143)而不是一个明显的整数来混淆程序员。
  • @duffymo 我实际上不确定该方法签名是否存在不正确或基于错误假设的任何内容。
  • @Chris:这就是我的想法,这就是我感到困惑的原因。我不明白泛型是做什么的。
  • 现在改了就对了。第一篇文章有​​

标签: java oop generics data-structures


【解决方案1】:

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

public int Add(int a, int b)

public double Add(double a, double b)

public float Add(float a, float b)

泛型允许您创建为调用它的类型定制的单个方法。

public <T> T Add(T a, T b)

T 被替换为您使用的任何类型。

【讨论】:

  • 好的,很清楚,谢谢!现在,如果我执行Stack&lt;Location&gt; = new Stack&lt;Location&gt;; 之类的操作,这是否意味着我有一个只能使用Location 对象的堆栈?
  • @Switz - 也许吧。您有一堆位置或位置派生对象。例如,如果您有一个从 Location 派生的名为“MyLocation”的类,您可以将其添加到您的堆栈中。
  • 谢谢,真的搞定了!
  • 除了上面的答案:我们在 ADT 中使用泛型来保证类型安全
  • 具有讽刺意味的是,泛型对于数字类型来说是一个糟糕的选择,因为数学运算不是接口的一部分。所以这是一个不好的例子。
【解决方案2】:

请参阅the Fundamentals in Angelika Langer's FAQ——它是您可能找到的与 Java 泛型相关的所有内容的最佳解释。也就是说,泛型最初的主要目标是启用“类型化”集合。

【讨论】:

  • 我正在读这个,谢谢。
  • 感谢链接真的很有帮助:)
【解决方案3】:

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

public <COPY> PASTE addTwoThings(PASTE a, PASTE b) {
    return a + b;
}

您指定一个类型(在&lt;COPY&gt; 部分中),java 在整个代码块中使用此类型,它将确保类型兼容。通过这样做,您可以避免编写:

  • addTwoIntegers
  • addTwoStrings
  • addTwoMyObjects

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

【讨论】:

  • 那么这里的结果是什么?
  • 结果是,如果您将“String”指定为类型(当您调用它时),那么您突然有了一个知道如何将两个字符串相加的方法。同样,如果您指定一个整数作为类型,它将添加两个整数并返回一个整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多