【发布时间】:2020-04-15 21:06:33
【问题描述】:
我能否在 scala 中以某种方式实现这样的行为(funcs 具有相同的名称和参数,但仅在返回类型和类型参数上有所不同)?
def a(i:Int): Int //1
def a[T](i: Int): Double //2
a(1) //call 1
a[Any](1) //call 2
UPD 动机:
我正在编写 akka-http 指令auth,它根据权限参数检查用户请求的会话和授权。
- 当它只获得一个权限时,它提供刚刚经过身份验证的
User:
def auth(perm: String): Directive1[User]
- 当它通过
UUID获得Tuple的权限时,它(以某种方式)通过此UUID获得所需的对象,检查应用于所需对象的权限并提供此对象以及User:
def auth[Entity](tup: (String, UUID)): Directive1[(User, Entity)]
-
并且当它获得相同的
Tuple但没有类型参数时,它应该检查应用于所需对象的权限但只提供经过身份验证的User:
def auth(tup: (String, UUID)): Directive1[User]
这个想法是为所有情况使用相同的指令名称,但似乎无法在语言级别区分 a[T](i: Int): Int 和 a(i: Int): Double(由于类型擦除)。
也许有一些使用implicits 的技巧有助于实现这一目标?
【问题讨论】:
-
用例是什么?如果
T不代表任何东西,那么它有什么意义。 -
@LuisMiguelMejíaSuárez 请检查问题,我更新了动机
-
动机似乎是“为所有情况使用相同的指令名称”,但是当它们做不同的事情并以不同的方式调用时,为什么它们具有相同的名称很重要?
-
@Tim 都是做认证和授权的,不同的只是其中一个提供了
Entity -
返回实体的那个做一些不同于只做身份验证的那个,这是给它一个不同的名字的一个很好的理由。为什么他们必须有相同的名字?这开始感觉像是XY problem
标签: scala generics types overloading akka-http