2011-11-30 92 views
3

在所有的例子我也準備這樣的函數定義的不斷彈出:爲什麼列出[T]而不是列表[Int]? T是什麼意思?

def firstElementInList[T](l: List[T]): T 

我已經習慣了看到List[Int]所以這將是一個整數列表。在這種情況下,我假設T是任何類型(請糾正我,如果我錯了)。什麼我真的被逮住的是[T]之後firstElementInList

回答

7

它只是一種方法來告訴:此函數引用一個泛型類型T(你是對的T任何類型)。

如果你有一個類中的多個方法:

def firstElementInList[T](l: List[T]): T = l.head 
def lastElementInList[T](l: List[T]): T = l.last 

然後每種方法都有自己的T類型,所以你可以先打電話方法與String秒的列表,第二個與Int列表秒。

但是全班圍繞這兩種方法可以有類型,以及:Foo對象創建期間

class Foo[T] { 
    def firstElementInList(l: List[T]): T = l.head 
    def lastElementInList(l: List[T]): T = l.last 
} 

在這種情況下,你挑類型:

val foo = new Foo[String] 

編譯器會阻止你從foo調用實例方法與除List[String]之外的任何其他類型。另外請注意,在這種情況下,您不再需要輸入[T]作爲方法 - 它來自封閉類。

+0

Ahh ..所以如果你做'新的Foo [字符串]'所有'T's將是類型'字符串'? – locrizak

+0

@locrizak。是。不僅編譯器不會讓你調用'new Foo [String] .firstElementInList(List(1,2,3)',而且'Foo [String]'和'Foo [Int]'被認爲是完全不同的 –

+0

非常感謝。非常有幫助 – locrizak

1

也就是說功能參數設置:你的猜測是正確的:如果你傳遞的IntsList,該函數將返回Int,如果傳遞的StringsList,返回值應該是String,等等。此外,您可以在功能範圍內使用此類型,例如,像這樣:

def foo[T](l: List[T]): T = { 
... 
val z = collections.mutable.HashMap[String,T] 
... 
} 
1

T是「未綁定」類型。換句話說,List<T>是「事物清單」的縮寫。

這意味着您可以使用相同的代碼,以使一個「日期列表」或「帳戶列表」,「人名單」,你只需要提供構造

List<Person> people = new List<Person>(); 

將結合T對人民。現在,當您訪問List時,它將保證前面沒有綁定的任何地方都會存在,它就會像在該位置上寫有「人員」一樣。例如,public T remove(int)將返回綁定到人員列表中的「人員」的T。這避免了需要添加明確的強制轉換。它還保證List內的唯一項目是至少人。

List<Person> people = new List<Person>(); // T is bound to "People" 
List<Account> accounts = new List<Account>(); // T is bound to "Account" 
Person first = people.remove(0); 
Account firstAccount = accounts.remove(0); 

// The following line fails because Java doesn't automatically cast (amongst classes) 
Account other = people.remove(0); 

// as people is a List<T> where T is bound to "People", people.remove(0) will return 
// a T which is bound to People. In short it will return something that is at least an 
// instance of People. This doesn't cast into an account (even though there are other 
// lists which would). 

注意,至少人的評論是,該名單可能包含多個對象,但是所有的對象必須是人的子類的指標。

+0

非常感謝。 – locrizak

相關問題