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

scala – 使用清单实例化视图有界类型

发布时间:2020-12-16 10:07:40 所属栏目:安全 来源:网络整理
导读:我正在尝试使用 Scala的清单来实例化一个类型,并且当在具有视图绑定的类型上对该类型进行参数化时,我遇到了问题.我已将问题归结为以下代码: class foo[X % Ordered[X]]() {}def boo[T](implicit m : Manifest[T]) = { m.erasure.newInstance().asInstanceOf
我正在尝试使用 Scala的清单来实例化一个类型,并且当在具有视图绑定的类型上对该类型进行参数化时,我遇到了问题.我已将问题归结为以下代码:

class foo[X <% Ordered[X]]() {}

def boo[T](implicit m : Manifest[T]) = { m.erasure.newInstance().asInstanceOf[T] }

boo[foo[String]]

java.lang.InstantiationException: foo
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)
    . . .

所以你可以看到我们有一个简单的类foo,它在X上参数化;这是由Ordered [X]限定的视图. boo函数只是尝试使用清单来实例化foo [String]的新实例.然而,当调用这个函数时,事情会非常糟糕,我得到的堆栈跟踪就像我展示的那样开始.当foo的类型参数不是视图有界时,实例化工作没有问题.我认为这与以下事实有关:视图绑定只是存在X =>的隐式转换的语法糖.订购[X],并且不知何故清单依赖于另一个清单导致问题.但是,我不知道发生了什么,或者更重要的是,如何解决它.这在Scala中是否可能,如果不是,人们如何实现类似的东西呢?

解决方法

newInstance仅在T具有无参数构造函数时才有效. foo没有.视图绑定<%(仅作为上下文绑定:)是构造函数中隐式参数的快捷方式. class foo [X<%Ordered [X]]与class foo相同(隐式freshName:X => Ordered [X]).缺少foo的无参数构造函数,newInstance失败.

(编辑:李大同)

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

    推荐文章
      热点阅读