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

scala – Serializable和AnyVal

发布时间:2020-12-16 18:58:53 所属栏目:安全 来源:网络整理
导读:我正在搜索一个带有函数func和参数arg的方法的正确签名,将它们通过网络复制到远程计算机并返回结果.目前签名如下: def invokeRemote[A,B](address: String,func: A = B,arg: A): B 这样做的问题是,如果参数不是Serializable或Java的原始类型之一,则该方法抛
我正在搜索一个带有函数func和参数arg的方法的正确签名,将它们通过网络复制到远程计算机并返回结果.目前签名如下:

def invokeRemote[A,B](address: String,func: A => B,arg: A): B

这样做的问题是,如果参数不是Serializable或Java的原始类型之一,则该方法抛出NotSerializable Exception.

我想出了以下解决方案,以便在编译时捕获此错误…

type Func = (A => B) with Serializable

def invokeRemote[A <: Serializable,B <: Serializable](address: String,func: Func,arg: A): B

…但现在不可能再传递AnyVal类型的参数,如Int,Float或Double,它们没有显式实现Serializable.

方法签名应该如何看起来只接受Serializable对象或AnyVal类型的对象作为参数?

解决方法

您可以使用隐式自定义特征的 context bound,并为该特征提供AnyVal和Serializable的隐式转换.

trait Ser[M]

implicit def toSer1[T <: AnyVal]: Ser[T] = new Ser[T] {}
implicit def toSer2[T <: java.io.Serializable]: Ser[T] = new Ser[T] {}

def f[T: Ser](a:T): T = a
f(1)
// res2: Int = 1
f("123")
// res3: java.lang.String = 123
f(new Object)
// could not find implicit value for evidence parameter of type Ser[java.lang.Object]

编译器将根据类型查找隐式参数,因为有些是为T&lt ;: AnyVal和T<:java.io.Serializable提供的,它将在这种情况下进行编译. 您可以将隐式定义粘贴到Ser的伴随对象中,以便它们在需要时可用. 然后,您的签名变为:

def invokeRemote[A:Ser,B:Ser](address: String,arg: A): B

(编辑:李大同)

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

    推荐文章
      热点阅读