在所有的例子我也準備這樣的函數定義的不斷彈出:爲什麼列出[T]而不是列表[Int]? T是什麼意思?
def firstElementInList[T](l: List[T]): T
我已經習慣了看到List[Int]
所以這將是一個整數列表。在這種情況下,我假設T
是任何類型(請糾正我,如果我錯了)。什麼我真的被逮住的是[T]
之後firstElementInList
在所有的例子我也準備這樣的函數定義的不斷彈出:爲什麼列出[T]而不是列表[Int]? T是什麼意思?
def firstElementInList[T](l: List[T]): T
我已經習慣了看到List[Int]
所以這將是一個整數列表。在這種情況下,我假設T
是任何類型(請糾正我,如果我錯了)。什麼我真的被逮住的是[T]
之後firstElementInList
它只是一種方法來告訴:此函數引用一個泛型類型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]
作爲方法 - 它來自封閉類。
也就是說功能參數設置:你的猜測是正確的:如果你傳遞的Ints
它List
,該函數將返回Int
,如果傳遞的Strings
List
,返回值應該是String
,等等。此外,您可以在功能範圍內使用此類型,例如,像這樣:
def foo[T](l: List[T]): T = {
...
val z = collections.mutable.HashMap[String,T]
...
}
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).
注意,至少人的評論是,該名單可能包含多個對象,但是所有的對象必須是人的子類的指標。
非常感謝。 – locrizak
Ahh ..所以如果你做'新的Foo [字符串]'所有'T's將是類型'字符串'? – locrizak
@locrizak。是。不僅編譯器不會讓你調用'new Foo [String] .firstElementInList(List(1,2,3)',而且'Foo [String]'和'Foo [Int]'被認爲是完全不同的 –
非常感謝。非常有幫助 – locrizak