我相信這樣的東西應該存在,而我只是不知道如何對它進行描述。用任何參數和已知返回類型定義函數
那麼有沒有辦法來定義一個廣義函數,它可以接受任意類型的任意數量的參數(從零開始)並返回一個已知類型的值?所以,如果我們定義
f: <something_here> => Int
任何函數返回Int
應滿足此比。
我相信這樣的東西應該存在,而我只是不知道如何對它進行描述。用任何參數和已知返回類型定義函數
那麼有沒有辦法來定義一個廣義函數,它可以接受任意類型的任意數量的參數(從零開始)並返回一個已知類型的值?所以,如果我們定義
f: <something_here> => Int
任何函數返回Int
應滿足此比。
不,沒有,沒有丟失類型安全(假設我正確理解你的問題)。最終,唯一的方法是使用例如類型的值String => Int
將爲其方法提供String
,但您如何知道提供給「返回Int
」的任何函數的參數類型?
如果你願意失去類型安全(你應該),你可以像
class UnsafeFunction[A] {
def apply(xs: Any*): A
}
object UnsafeFunction {
implicit def fromF1[A, B](f: A => B): UnsafeFunction[B] = new UnsafeFunction[B] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A])
}
implicit def fromF2[A, B, C](f: (A, B) => C): UnsafeFunction[C] = new UnsafeFunction[C] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A], xs(1).asInstanceOf[B])
}
...
}
這允許分配返回Int
至UnsafeFunction[Int]
類型的值的任何功能,或者實現它將其傳遞給採用這種論點的方法。再一次,我非常不建議在實踐中使用它。
什麼你可以有效做的是使用泛型類型,如A => Int
和(A, B) => Int
,其中A
是你的類型或方法的類型參數。斯卡拉本身不允許你統一不同的號碼的功能,但有一個庫,它會:Shapeless。不幸的是,使用它並不是微不足道的。
我認爲這將做到這一點:
def f[T](x:T*): Int = ???
它接受任何數目的T
類型的參數和返回Int
。在該函數中,您可以訪問x
變量Seq[T]
,因此可以相應地處理這些參數。
但是,您可能想要定義T
類型的上限,具體取決於您想要對它們執行的操作。
您可以編寫一個函數,該函數可以將Any
作爲參數,並將Int作爲返回類型
def f(x: Any*) : Int = x.length
上述函數接受任何數目的任何類型的參數,並返回傳遞 參數號您可以執行它 -
f(1,2,3) // This will return 3
f(1,'b') // This will return 2
希望這澄清了您的疑問!