標籤:

public static <T> List<T> asList(T... a) 原型是怎麼回事?

翻翻java sdk的源代碼 發現這個看起來好屌,
& List& 是怎麼回事 看起來好像顏文字,一個在哭的List
第一個&這個token是什麼意思呢?為什麼不省略,省略了我也知道是返回一個
List&
這個姿勢怎麼學?


public:
template&
static List& asList(T a);

那三個T分別是這三個意思


public static & List& asList(T_T... a);


泛型的意思是就是說類型可以在以後指定,但是這仍然需要告訴編譯器,我需要某個類型作為一個佔位符,比如T。

public List& fuck(T shit) {
...
}

然後編譯器會問你說,T是個什麼鬼?你沒有告訴我啊(Cannot resolve symbol)。
所以需要在前面顯式地聲明一下(這就是為啥不能省略),就成了

public & List& fuck(T ...) ...

共出現了三個T,第一個是用來聲明類型參數的,後面的兩個才是泛型的實現。
所以說Java這種寫法醜死了。
看我C#聲明和使用多麼一致。

public List& fuck&(T shit)
{
...
}

看我C++,清清楚楚地標明啥是啥。

template&
list& fuck(T... shits)
{
...
}

說起來你要覺得看著像顏文字的話,可以這樣寫啊:

& List& fuck(Type... ) ...

然而並沒有什麼用。

以上。


&是申明T為泛型,以區別於類名。

public class A {
}
案例1. public static & List& asList(A... a);
案例2. public static List& asList(A... a);

案例1中A為「泛型A」,參數可以傳入任何類型對象的數組;案例2則不是,其中A為「類A」,參數只能傳入「類A」的對象的數組。

----------------------------------------------


補充一點,案例1中使用泛型絕不是因為要使參數可以傳入任意類型,如果僅僅是這樣,直接用Object就可以了。用泛型是因為可以使該方法的返回值成為一個指定類型的集合,這樣再次使用該集合的時候就有一個明確的類型了,這使的在將來該類型發生改變的時候編譯器會報錯,提醒你做相應的修改,而不是讓問題暴露在運行階段。這是泛型的重要作用之一。


第一個T就是振臂一呼,告訴大夥,哥是個類型,以後見到別不認識我。


List&中的T可以換成任何一個類名,asList(T... a)中的T也可以換成任何一個類名,所以編譯器並不知道你這個T是個什麼吊東西,所以需要聲明下。不過這種寫法太丑了是真的。


老子在vs里試了半天 往下一看是java


第一個T是聲明泛型,List的T是List存T類型的元素,最後一個T表示asList這個方法接收的參數類型是T類型的。

嗯,我是這麼理解的。


這裡用了Java泛型 T是一種類型 List是返回值為List類型,內部裝有類型為T的對象,而括弧裡面的表示傳遞一組T類型的變數,這種方式叫可變參數傳遞,其實相當於一個T類型的數組。


代碼中一共出現了三個T,第一個是定義泛型的意思,第二個是返回的類型,第三個是參數的類型,這三個類型可以說是由參數的類型來決定的。


第一個出現的T,是定義一個范型名為T,當然可以為任何一個或多個字母。

後面出現兩個T都是在使用范型,前一個代表返回T類型變數,後一個是只接受T類型變數的可變參數(可變參數:一個或者多個,其實最後會被轉化成數組)。


推薦閱讀:

Android有什麼好的技術點適合進行技術分享?
如何有逼格地輸出「Hello, World!」?
垃圾回收機制中,引用計數法是如何維護所有對象引用的?
碼農們最常說的「謊言」有哪些?
IT行業都有哪些職位,初學者(0基礎,新人)該如何選擇,才能夠快速進入這個行業?

TAG:Java | JavaSE |