簡體   English   中英

了解Scala中的類型參數

[英]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類型的對象,對嗎?

提前致謝。

  1. [ 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
  1. 為什么我們要對類做同樣的事情?

您通常希望在類中包含某種類型的對象。 如果在類級別定義type參數,則整個類的類型將保持不變。 考慮以下示例:

class Container[T](val t: T) {
    def isValueEqual(obj: T): Boolean = t.equals(obj)
}

這里, Tobj: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM