【发布时间】:2019-08-26 14:40:38
【问题描述】:
我坦率地承认在这里有点超出我的深度。我在类型系统方面的正式培训比我晚了几十年。我在 Java 中使用过泛型一两次,但我不能声称对它们有深刻而透彻的理解。我也是 Scala 的新手,所以我也没有声称对它的类型系统有深刻或透彻的了解。
我开始更新我的 XML Calabash v2 实现,它是用 Scala(今天的 2.12)编写的,以使用 Saxon 9.9。 Saxon 9.9 在许多地方引入了泛型。我没意见。我想我可以应付。
不过,我显然不能。
绊脚石是试图实现一个扩展 ExtensionFunctionDefinition 类的类。它有一个扩展 ExtensionFunctionCall 类的内部类。反过来,它有一个抽象方法 call,在 Java 中如此定义:
public abstract Sequence<?> call(
XPathContext context,
Sequence[] arguments
)
我第一次尝试在 Scala 中定义它是:
override def call(
context: XPathContext,
arguments: Array[Sequence]
): Sequence[_]
但这不能编译:“trait Sequence 接受类型参数”。
这是真的:
public interface Sequence<T extends Item<?>>
(项目,顺便说一句,是:
public interface Item<T extends Item<?>>
extends GroundedValue<T>
由于其他原因,我觉得有点令人困惑)
对于我的第二次尝试,我尝试了:
override def call(
context: XPathContext,
arguments: Array[Sequence[_]]
): Sequence[_]
但是,有人告诉我,这不会覆盖任何东西。听着,编译器说:
[error] (Note that Array[net.sf.saxon.om.Sequence]
does not match Array[net.sf.saxon.om.Sequence[_]]:
their type parameters differ)
我们似乎陷入了僵局。当然,我可以在 Java 中实现该死的东西,但这是 Scala 的实际限制还是我的理解?
顺便说一句,关于我的第一次尝试,我之前一直在撒谎。我的第一次尝试实际上是:
override def call(
context: XPathContext,
arguments: Array[Sequence[_ <: Item[_ <: Item[_]]]]
): Sequence[_ <: Item[_ <: Item[_]]]
我通过直接将 Java 复制到 Scala 并让 IntelliJ IDEA 翻译它来制作。我没有弄清楚如何处理 Item 声明的递归性质。
【问题讨论】:
-
另一个关于raw types 的问题目前在热门问题中。多么奇怪的巧合。