簡體   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