假设我有一些类型类
trait FooBar[X]
FooBar[Int]
的示例:
given intIsFooBar: FooBar[Int] = new FooBar {}
现在,假设我有一个接口Intf
,它有一些成员类型A
,并且还保证有一个given FooBar[A]
:
trait Intf:
type A
given aIsFoobar: FooBar[A]
现在,我有一个Int
类型,还有一个FooBar[Int]
,但是我如何为Int
实现这个接口呢?
如果我尝试
class IntImpl() extends Intf:
type A = Int
given aIsFoobar: FooBar[A] = summon
然后我得到 “Infinite loop in function body IntImpl.aIsFoobar” 错误,因为summon
似乎看到了aIsFoobar
而不是intIsFooBar
。
如果我尝试在一些辅助辅助辅助变量中summon
示例,如下所示:
class IntImpl() extends Intf:
type A = Int
private final val _aIsFoobar: FooBar[A] = summon
given aIsFoobar: FooBar[A] = _aIsFoobar
然后我遇到了初始化顺序问题:aIsFoobar
原来是null
,我的应用程序崩溃与NullPointerExceptions
,这是有点荒谬。
我也试过export
,但都不起作用:
export FooBar[Int] as aIsFoobar // doesn't compile, invalid syntax
如何使“规范”FooBar[Int]
作为aIsFoobar
给定成员可用?
完整代码:
trait FooBar[X]
given intIsFooBar: FooBar[Int] = new FooBar {}
trait Intf:
type A
given aIsFoobar: FooBar[A]
object IntImpl extends Intf:
type A = Int
given aIsFoobar: FooBar[A] = summon
1条答案
按热度按时间7bsow1i61#
在Scala 2中,可以使用隐藏隐式名称的技巧
NullPointerException on implicit resolution
In Scala 3, what's the canonical method for pattern match that uses an erased type?
Is there a workaround for this format parameter in Scala?
Extending an object with a trait which needs implicit member
Constructing an overridable implicit(answer)
在Scala 3中,这个技巧不再起作用了。
在Scala 3中,您可以尝试创建方法inline并使用
scala.compiletime.summonInline
而不是普通的summon
重写内联方法:https://docs.scala-lang.org/scala3/reference/metaprogramming/inline.html#rules-for-overriding
请注意,我们通过内联修改了方法的语义,隐式是在调用点解析的,而不是在定义点
一个二个一个一个
关于
implicitly
与implicit
的区别:When doing implicit resolution with type parameters, why does val placement matter?
Why the Scala compiler can provide implicit outside of object, but cannot inside?(answer)
Setting abstract type based on typeclass
SYB
cast
function in ScalaIn scala 2, can macro or any language feature be used to rewrite the abstract type reification mechanism in all subclasses? How about scala 3?
In Scala 2.13, why is it possible to summon unqualified TypeTag for abstract type?
在Scala 2中,内联可以通过Scala 2 macros实现。
Implicit Json Formatter for value classes in Scala
在https://docs.scala-lang.org/scala3/reference/contextual/relationship-implicits.html#abstract-implicits上
Scala 2中的抽象隐式瓦尔或def可以在Scala 3中使用常规抽象定义和给定的别名来表示。
在Scala 3中可以表示为
您可以询问如何在Scala 3中覆盖implicit而不更改定义站点语义,可能只是手动解析implicit而不是使用
summon
更通用但不太传统的解决方案是使用Scala 3 macros +编译器内部构件
Finding the second matching implicit
或者可以尝试将
A
作为类型参数而不是类型成员