2017-05-11 68 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 

希望这澄清了您的疑问!

相关问题