繁体   English   中英

Java:什么是 - public static <T> foo(){...}?

[英]Java : What is - public static<T> foo() {…}?

我看到一个看起来像这样的java函数 -

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

我知道什么是泛型,但有人可以解释这个背景吗? 谁决定T等于什么? 这里发生了什么?

编辑:有人可以给我看一个像这样的功能的例子。

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

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

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

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

有可能有通用的构造函数,但我从来没有见过一个,语法变得更糟。

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

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

编译器决定T等于什么 - 它等于获得类型的工作。 有时这比其他人容易。

例如,方法static <T> Set<T> Collections.singleton(T o)的类型在参数中定义:

Collections.singleton(String T)

将返回Set<String>

有时类型很难定义。 例如,有时没有足够的信息来输入Collection.emptyList() 在这种情况下,您可以直接指定类型: Collection.<String>emptyList()

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

例如,这是包java.util中的List和Iterator definitios:

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM