加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 强制执行“排除”超类型的下限

发布时间:2020-12-16 09:59:40 所属栏目:安全 来源:网络整理
导读:Scala中的边界允许更精细地控制Scala中的类型,例如参数类型. 例如 def foo[ S : String ]( arg: S ): S = ... 上面允许函数接受作为String子类型的参数 def bar[ S : A : B ]( arg: S ): S = ... 以上允许设置上限和下限,使得S是B的子类型和A的超类型. 我的
Scala中的边界允许更精细地控制Scala中的类型,例如参数类型.
例如

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

上面允许函数接受作为String子类型的参数

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

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

我的问题是(我假设边界是包容性的)是否可以设置一个参数类型,以便参数可以是String的超类型,但不包括下限的一些超类型(在本例中为String)输入任何.

UPDATE

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调用会导致非法的参数异常.

解决方法

对于更复杂的类型约束,您可以通过implicit进行类型级编程:

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只能用类型S调用,可以解析隐式Helper [S]. stringSubtype为任何S>:String提供Helper [S].但是对于Any,这个和任何apply以及两个implicits冲突,所以它是不可能的(好吧,除非通过显式传递一个或另一个)来调用foo [Any].

更新:似乎任何都比stringSubtype更优先级,所以它已经解决了foo [Any].最简单的解决方法是定义any2,而不是弄清楚为什么会这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读