强制执行 "excludes" 超类型的下限

Enforce a lower-bounds that "excludes" a super type

Scala 中的边界允许对 Scala 中的类型进行更精细的控制,例如参数类型。 例如

def foo[ S <: String ]( arg: S ): S = ...

以上允许函数接受字符串子类型的参数,也

def bar[ S >: A <: B ]( arg: S ): S = ...

上面允许设置上限和下限,使得S是B的子类型和A的超类型。

我的问题是(我假设界限是包含在内的)是否可以设置一个参数类型,以便该参数是 say String 的超类型,但不包括下限的某些超类型(在这种情况下 String) 说类型 Any.

更新

sealed trait Helper[S]
object Helper {
  implicit def stringSubtype[S >: String] = new Helper[S]{}
  implicit def any = new Helper[Any]{}
}

def foo[S: Helper](r: S): Int = 1

val arg1: String = "hi"
val arg2: Any    = "hello"

foo(arg1)
foo(arg2)

我希望使用 arg2 的调用会导致非法参数异常。

对于像这样更复杂的类型约束,您可以通过隐式进行类型级编程:

sealed trait Helper[S]
object Helper {
  implicit def stringSubtype[S >: String] = new Helper[S]{}
  implicit def any = new Helper[Any]{}
  implicit def any2 = new Helper[Any]{}
}

def foo[S: Helper] = ...

foo 只能用可以解析隐式 Helper[S] 的类型 S 调用。 stringSubtype 为任何 S >: String 提供 Helper[S]。但是对于 Anyanyany 都适用,并且这两个隐含冲突,所以不可能(好吧,除非显式传递一个或另一个)调用 foo[Any].

更新:似乎 any 的优先级比 stringSubtype 高,因此 foo[Any] 已解决。最简单的解决方法是同时定义 any2.

而不是弄清楚这是为什么