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

是否有可能在Scala中找到类型系统级别的常见超类型?

发布时间:2020-12-16 09:24:01 所属栏目:安全 来源:网络整理
导读:是否有可能在Scala中创建一个类型别名(或类似的东西),它接受两个参数并返回它们的常见超类型?换句话说,我正在尝试使用此签名找到一些东西: type CommonSupertype[A,B] // can't be more specific 这些都适用:(伪代码) CommonSupertype[String,Int] = AnyCo
是否有可能在Scala中创建一个类型别名(或类似的东西),它接受两个参数并返回它们的常见超类型?换句话说,我正在尝试使用此签名找到一些东西:

type CommonSupertype[A,B] // can't be more specific

这些都适用:(伪代码)

CommonSupertype[String,Int] = Any
CommonSupertype[JButton,JPanel] = JComponent

等等

我自己无法找到它,但我不能使用添加额外参数等替代方法,因为我必须遵循预先指定的接口.

解决方法

(不是一个完整的解决方案,但可能会提供一些想法)

Scala的一个令人印象深刻的功能是它能够在将橙色附加到苹果列表时返回水果列表.
它的值很好,正是因为你推断了泛型类型.

import scala.reflect.Manifest

def CommonSuperType[A,B >: A : Manifest](a:A,b:B) = manifest[B]

它有效(有点):

scala> CommonSuperType(new JButton,new JPanel)
res42: Manifest[javax.swing.JComponent with javax.accessibility.Accessible] = javax.swing.JComponent with javax.accessibility.Accessible

下一步是将此技巧提升到更高级别的类型(未经测试).
半成品解决方案包括从类型创建值(cf this answer):

class CommonSuper[A:Manifest,B:Manifest] {
   def make[T:Manifest] = manifest[T].erasure.newInstance.asInstanceOf[T]
   val instanceA = make[A]
   val instanceB = make[B]
   def getType = CommonSuperType(instanceA,instanceB)
}

但我陷入了这种不直观的矛盾:

scala> val test = new CommonSuper[JButton,JPanel]

scala> test.getType
res66: Manifest[Any] = Any

scala> CommonSuperType(test.instanceA,test.instanceB)
res67: Manifest[javax.swing.JComponent with javax.accessibility.Accessible] = javax.swing.JComponent with javax.accessibility.Accessible

无论如何,虽然我喜欢这类问题(关于类型的问题),但它闻起来像XY Problem.

(编辑:李大同)

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

    推荐文章
      热点阅读