gpt4 book ai didi

scala:用具体类型覆盖通用的存在类型的值

转载 作者:行者123 更新时间:2023-12-02 01:37:34 26 4
gpt4 key购买 nike

我有一个通用特征 MappingPath,关于它的类型参数是不变的:

trait MappingPath[X<:AnyMapping, Y<:AnyMapping]

以及它的工厂接口(interface):

trait Pathfinder[X, Y] {
def apply(fun :X=>Y) :MappingPath[_<:AnyMapping,_<:AnyMapping]
def get(fun :X=>Y) :Option[MappingPath[_<:AnyMapping, _<:AnyMapping]]
}

我启动了一个适用于单个映射的框架实现:

class MappingPathfinder[M<:AnyMapping, X, Y] extends Pathfinder[X, Y] {
override def apply(fun :X=>Y) :MappingPath[M, _<:AnyMapping] = ???
override def get(fun :X=>Y) :Option[MappingPath[M, _<:AnyMapping]] = ???
}

这会产生一个编译错误,提示 MappingPathfinder.apply不覆盖任何内容且不执行 Pathfinder.apply .有趣的是,替换 M_<:AnyMappingapply的返回类型使其编译,并且没有关于类似 get 的投诉方法。

这是怎么回事?我使用 scala 2.11.5。

编辑:我能够通过添加明确的存在注释来规避我的问题:

//Pathfinder
def apply(fun :X=>Y) :MappingPath[A, B] forSome { type A<:AnyMapping; type B<:AnyMapping }

//MappingPathfinder
def apply(fun :X=>Y) :MappingPath[A, B] forSome { type A>:M<:M; type B<:AnyMapping }

它似乎有效,即我能做到:

(p :MappingPath[_<:AnyMapping, M]) ++ mappingPathfinder(f),

哪里++需要以与 this 完全相同的类型开头的路径结束。它看起来有点傻,但确实令人困惑。

最佳答案

不是答案,但您的用例可以简化为:

trait Higher[U]

trait Super {
def foo: Higher[_]
}

trait Sub[M] {
override def foo: Higher[M] // error: method foo overrides nothing
}

我会使用类型成员来代替存在类型:

trait Super {
type U
def foo: Higher[U]
}

trait Sub[M] {
type U = M
}

我认为不同之处在于,在存在类型的情况下,您只指定返回的类型参数有一些上限,但不一定总是相同的类型;而在我的第二个示例中,type U 意味着这最终将是一种特定类型,您只能优化特定类型。您可以使上限更精确:

trait Upper

trait A {
type U <: Upper
}

trait Specific extends Upper

trait B extends A {
type U <: Specific // type is "overridden"
}

如果可能的话,我会避免存在类型,而你的情况似乎非常适合这种避免。大多数时候,只有 Java 互操作才需要存在类型。

关于scala:用具体类型覆盖通用的存在类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com