[英]Understanding type Parameters in Scala
我試圖了解Scala中的類型參數。 讓我們看下面的一般示例:
def func1[T](a : T) : T = a
我知道func1接受任何類型的1個參數,並返回相同類型的該參數。 我不明白的是為什么:
def func1[T]
為什么在功能1之后是[T]? 我們可以簡單地在func1之后寫上不帶[T]的代碼,例如:
def func1(a : T) : T = a
1)[T]在func1之后意味着什么,為什么我們把它放在那里?
2)為什么我們要對類做同樣的事情?
class MyClass[T]{...}
我的意思是MyClass實例化是MyClass類型。 [T]在那里意味着什么? 您不是說我有MyClass類型的布爾類,而是說我有MyClass類型的對象,對嗎?
提前致謝。
func1
]在func1
之后是什么意思,為什么我們把它放在那里? func[T]
[T]
中的func[T]
定義類型參數T
您的函數可以像func[String]("Hello")
一樣func[String]("Hello")
,其中String
替換為T
您也可以像func("Hello")
一樣調用它,因為Scala編譯器足夠聰明,可以推斷T
必須為String
。
那么,為什么在定義它時必須寫func[T]
? 我們需要區分類型參數給定的類型參數和實際類型給定的參數。 如果您這樣編寫: def func1(a : T) : T = a
,則T
必須是實際類型。 例如:
class T
def func1(a : T) : T = a // <-- This compiles now
您通常希望在類中包含某種類型的對象。 如果在類級別定義type參數,則整個類的類型將保持不變。 考慮以下示例:
class Container[T](val t: T) {
def isValueEqual(obj: T): Boolean = t.equals(obj)
}
這里, T
在obj: T
是相同的類型T
中定義Container[T]
現在考慮以下示例:
class Container[T](val t: T) {
def isValueEqual[T](obj: T): Boolean = t.equals(obj)
}
注意,我也在方法級別定義了一個新的類型參數( isValueEqual[T]
)。 在這種情況下, T
在該方法將遮蔽定義T
在類級定義的。 這意味着它們可能不是同一類型! 您可以這樣稱呼它:
val c = new Container("Hello")
println(c.isValueEqual(5)) // 5 is not of type String!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.