【问题标题】:Java : What is - public static<T> foo() {...}?Java:什么是 - public static<T> foo() {...}?
【发布时间】:2010-11-08 18:02:51
【问题描述】:

我看到一个类似这样的 java 函数-

public static<T> foo() {...}

我知道泛型是什么,但有人可以在这种情况下解释一下吗?谁决定 T 等于多少?这是怎么回事?

编辑:谁能给我看一个这样的函数的例子。

【问题讨论】:

  • 你的意思是:public static int binarySearch(List extends Comparable super T>> list, T key) in Collections?它只是一个泛型类型,在这种情况下,如果您的键是字符串,那么您的 List 必须是实现 Comparable 可以比较字符串的元素。没有什么可以决定 T 等于什么,它只是编译时检查。

标签: java generics static-methods


【解决方案1】:

你错过了返回类型,但除此之外它是一个通用方法。与泛型类型一样,T 代表任何引用类型(在给定的范围内)。

对于方法,泛型参数通常由编译器推断。在某些情况下,您可能希望自己指定通用参数,使用稍微特殊的语法:

    List<String> strings = Collections.<String>emptyList();

在这种情况下,编译器可以推断出类型,但编译器是否可以推断并不总是很明显。请注意,&lt;&gt; 在点之后。出于语法原因,必须始终指定类型名称或目标对象。

可以有泛型构造函数,但我从未见过这样的构造函数,而且语法变得更糟。

我相信 C++ 和 C# 语法将泛型类型放在方法/函数名称之后。

【讨论】:

  • 你摇滚。看哪,真正的 Java 大师! /鞠躬/ :D
【解决方案2】:

T 这是形式类型参数,将被实际类型替换 在对象实例化时使用的参数。

例如,这里是 java.util 包中的 List 和 Iterator 定义:

public interface List<E>{
  void add(E x);
  Iterator<E> iterator();
}

public interface Iterator<E>{
  E next();
  boolean hasNext();
}

那么你可以这样实例化一个List:

List<String> ls = new ArrayList<String>()

您可能会认为 List 代表 List 的一个版本,其中 E 有 被String统一替换:

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}

【讨论】:

  • 不一定有任何对象被实例化。 (使用对示例应该是什么的合理猜测。)
  • Hhmm.. 你说得对,替换是在 compilation 时完成的(但无论如何,这将用于稍后实例化对象)
  • 根本不需要任何对象实例化。语法似乎适用于泛型方法,而不是泛型类型。 (从技术上讲,提问者的示例需要一个替换来获得一个有效的语法,它可能是public &lt;T&gt; foo() { ... },这在技术上是名为foo 的类的有效语法(或者编译器是否抱怨不使用泛型参数?)。)跨度>
  • 好吧,你又说对了,我应该多加注意:P。不,编译器不会抱怨它。
  • 这与我的问题无关。
【解决方案3】:

上下文是一个通用方法而不是一个类。变量&lt;T&gt; 仅适用于方法的调用。Collections 类有许多这些;类本身不是泛型的,但很多方法都是。

编译器决定 T 等于什么——它等于使类型工作的任何值。有时这比其他人更容易。

例如方法static &lt;T&gt; Set&lt;T&gt; Collections.singleton(T o)的类型在参数中定义:

Collections.singleton(String T)

将返回Set&lt;String&gt;

有时类型很难定义。例如,有时输入Collection.emptyList() 的信息并不容易。在这种情况下,您可以直接指定类型:Collection.&lt;String&gt;emptyList()

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2010-11-13
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2014-09-24
    • 2013-05-19
    • 2019-11-23
    相关资源
    最近更新 更多