2017-05-11 66 views
1

我相信這樣的東西應該存在,而我只是不知道如何對它進行描述。用任何參數和已知返回類型定義函數

那麼有沒有辦法來定義一個廣義函數,它可以接受任意類型的任意數量的參數(從零開始)並返回一個已知類型的值?所以,如果我們定義

f: <something_here> => Int 

任何函數返回Int應滿足此比。

回答

1

不,沒有,沒有丟失類型安全(假設我正確理解你的問題)。最終,唯一的方法是使用例如類型的值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]) 
    } 
    ... 
} 

這允許分配返回IntUnsafeFunction[Int]類型的值的任何功能,或者實現它將其傳遞給採用這種論點的方法。再一次,我非常不建議在實踐中使用它。

什麼你可以有效做的是使用泛型類型,如A => Int(A, B) => Int,其中A是你的類型或方法的類型參數。斯卡拉本身不允許你統一不同的號碼的功能,但有一個庫,它會:Shapeless。不幸的是,使用它並不是微不足道的。

1

我認爲這將做到這一點:

def f[T](x:T*): Int = ??? 

它接受任何數目的T類型的參數和返回Int。在該函數中,您可以訪問x變量Seq[T],因此可以相應地處理這些參數。

但是,您可能想要定義T類型的上限,具體取決於您想要對它們執行的操作。

1

您可以編寫一個函數,該函數可以將Any作爲參數,並將Int作爲返回類型

def f(x: Any*) : Int = x.length 

上述函數接受任何數目的任何類型的參數,並返回傳遞 參數號您可以執行它 -

f(1,2,3) // This will return 3 
f(1,'b') // This will return 2 

希望這澄清了您的疑問!

相關問題