2009-07-07 76 views
5

我看到了,看上去有點像這個 -Java:什麼是 - public static <T> foo(){...}?

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

我知道什麼是仿製藥,但有人可以解釋在這方面的Java函數?誰決定什麼T等於?這裏發生了什麼?

編輯:有人可以請給我看一個這樣的功能的例子。

+0

你的意思是:public static int binarySearch(List <?extends Comparable > list,T key)in Collections?它只是一個泛型類型,在這種情況下,如果你的鍵是一個字符串,那麼你的List必須是實現Comparable的元素,它可以比較字符串。沒有什麼可以決定T是什麼,它只是編譯時間檢查。 – JeeBee 2009-07-07 15:54:08

+0

是的,這就是我的意思。 – quilby 2009-07-29 14:00:34

回答

11

您錯過了退貨類型,但除此之外它是一種通用方法。與泛型類型一樣,T代表任何引用類型(如果給定,則在範圍內)。

對於方法,通用參數通常由編譯器推斷。在某些情況下,你可能希望自己指定的通用參數,使用稍微特殊的語法:

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

在這種情況下,編譯器可能推斷出的類型,但它並不總是顯而易見是否編譯器可以或可以」噸。請注意,<>在點之後。出於語法原因,必須始終指定類型名稱或目標對象。

有可能有通用的構造函數,但我從來沒有見過一個在野外,語法變得更糟。

我相信C++和C#語法將泛型類型放在方法/函數名稱後面。

+0

唉!我的眼睛!它燃燒! – skaffman 2009-07-07 15:55:08

+0

你搖滾。看哪,真正的java大師! /向下彎曲/:D – jrharshath 2009-07-07 15:55:33

0

這是一個正式的類型參數,它將被在實例化對象時使用的實際類型 參數取代。

例如,這裏是在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(); 
} 
2

上下文是一種通用的方法,而不是類。變量<T>僅適用於該方法的調用。Collections類具有多個這些;類本身不是通用的,但許多方法是。

編譯器決定什麼T等於 - 它等於什麼類型的工作。有時候這比其他人更容易。

例如,static <T> Set<T> Collections.singleton(T o)類型在所述參數中定義的方法:

Collections.singleton(String T) 

將返回一個Set<String>

有時這種類型很難定義。例如,有時候不容易輸入信息來輸入Collection.emptyList()。在這種情況下,您可以直接指定類型:Collection.<String>emptyList()

相關問題