是否有可能在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 下一步是将此技巧提升到更高级别的类型(未经测试). 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |