强制执行 "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]
。但是对于 Any
,any
和 any
都适用,并且这两个隐含冲突,所以不可能(好吧,除非显式传递一个或另一个)调用 foo[Any]
.
更新:似乎 any
的优先级比 stringSubtype
高,因此 foo[Any]
已解决。最简单的解决方法是同时定义 any2
.
而不是弄清楚这是为什么
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]
。但是对于 Any
,any
和 any
都适用,并且这两个隐含冲突,所以不可能(好吧,除非显式传递一个或另一个)调用 foo[Any]
.
更新:似乎 any
的优先级比 stringSubtype
高,因此 foo[Any]
已解决。最简单的解决方法是同时定义 any2
.