我看到那个看起来是这样的一个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包中的列表和Iterator definitios:

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

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

然后就可以实例化一个列表是这样的:

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

您可以想象,列表代表一个版本列表,其中E具有 被均匀地由字符串替代:

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top