【问题标题】:A little confusion around generics关于泛型的一些困惑
【发布时间】:2014-03-17 18:05:26
【问题描述】:

我开始阅读一些关于 Java 泛型的文章,但有一件事让我很困惑:

public static <t> T getFirst(List<T> list)

“此方法将接受对 List 的引用并返回 T 类型的对象。”

很酷,但是&lt;t&gt; 是做什么的(小写字母,在静态之后)?我试过了,没看懂……

【问题讨论】:

  • 应该是&lt;T&gt;而不是&lt;t&gt;
  • @Kugathasan Abimaran 请不要更改t 的大小写——这正是问题所在
  • 我只是从文章中复制过来的,不明白为什么要小写?这就是重点
  • @KugathasanAbimaran 没有。阅读问题:what does &lt;t&gt; do (the lower case one, after static)。如果您修改它,任何人都能够将其与代码对应起来吗? 切勿修改代码格式和缩进以外的问题中的代码,因为它可能会改变问题的整个概要
  • @KugathasanAbimaran 对,文章中的错字 OP 正在阅读,不是问题

标签: java generics


【解决方案1】:

应该是:

public static <T> T getFirst(List<T> list)
  • 那么,&lt;T&gt; 是什么意思?

    表示这个方法的作用域有一个叫做&lt;T&gt;的类型。该方法还将返回该类型的实例T

  • 如何使用?

    如果您传递List&lt;String&gt;,该方法应返回列表中的第一个String

    如果您传递List&lt;Integer&gt;,该方法应返回列表中的第一个Integer

  • 支持这种方法有什么意义?

    • 您不必重载具有不同签名的方法,根据List中的对象类型和

    • 您不必担心该方法会返回列表中对象的类型以外的其他类型,例如,这将减轻您可能进行强制转换的负担。

      李>

【讨论】:

  • 不确定你说的是哪个。我理解第二个(List 列表),但我只是不确定为什么我们需要 T 而不仅仅是 T。但我想我开始有了一个想法。
  • 如果你有一个参数List&lt;T&gt; list,你应该在某个地方定义一个泛型类型&lt;T&gt;(对于类或仅对于方法)。
  • 好的,如果类声明看起来像:public class Foo {...},那么它里面的方法可能就是:public static T getFirst(List list) ?
  • 没错。你可以试试看:)
【解决方案2】:

也许这样更容易理解:

public static <T> T getFirst(T something)

简单来说就是T类型会是后面调用​​方法时给的参数:

String text = "text";
getfirst(text);

现在编译器会知道这里所有的 T 都表示String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2014-11-02
    • 2016-09-15
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多