Problem:
trait UpperBound[O]
trait High[F[O] <: UpperBound[O]]
def canEqual(that :Any) = that.isInstanceOf[High[_]]
def high(h :High[_]) = ???
无法编译,因为 scalac 看到_
类型而不是它期望的类型构造函数。如何解决这个问题,最好不写小说?
原始问题(在编辑回复 Dmytro 的答案之前)有:
def canEqual(that :Any) = that.isInstanceOf[High[m forSome { type m[O] <: UpperBound[O] }]]
def high(h :High[m forSome { type m[O] <: UpperBound[O] }] = ???
是否有使用通配符表达式来编写上述两种方法的更短方法?
只需使用_
in High
的类型参数位置不起作用,因为类型不匹配,并且_[_]
甚至不是有效的类型表达式。
-
如果你在外面进行存在量化High
那么就只是
type T = High[F] forSome { type F[O] <: UpperBound[O] }
def canEqual(that: Any) = that.isInstanceOf[T]
def high(h: T) = ???
-
如果你在里面进行存在量化High
然后自从
implicitly[(n forSome { type n <: Upper}) =:= Upper]
implicitly[(m[O1] forSome { type m[O] <: UpperBound[O]}) =:= UpperBound[O1]]
(反之亦然)这只是High[UpperBound]
implicitly[High[m forSome { type m[O] <: UpperBound[O] }] =:= High[UpperBound]]
def canEqual(that: Any) = that.isInstanceOf[High[UpperBound]]
def high(h: High[UpperBound]) = ???
存在主义类型???? forSome { ???? }
where ????
包含子句类型????[tps]>:????<:????
相当于类型????′ forSome { ???? }
where ????′
由于。。。导致的结果????
通过替换每个协变出现????
in ????
by ????
并通过替换每个逆变出现????
in ????
by ????
.
https://scala-lang.org/files/archive/spec/2.13/03-types.html#simplification-rules
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)