我承认在这方面我有点力不从心。我接受过类型系统的正式培训,但那已经是几十年前的事情了。我曾经在Java中使用过泛型,但只是一两次很简单的使用,并不能说我对它们有深入和全面的理解。我也是Scala的相对新手,因此并不声称对其类型系统有深入或全面的理解。
我打算更新我的XML Calabash v2实现,用Scala(今天是2.12)来使用Saxon 9.9。Saxon 9.9在许多地方引入了泛型,这也没问题。我想我能应付得了。
除了,显然我做不到。
绊住我的地方是试图实现一个扩展ExtensionFunctionDefinition类的类。它有一个扩展ExtensionFunctionCall类的内部类。它又有一个抽象方法call,在Java中定义如下:
(顺便说一下,"Item" 指的是:)
我发现其中还有其他令人困惑的原因。
对于我的第二次尝试,我尝试了:
我打算更新我的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 takes type parameters”。
这是正确的:
public interface Sequence<T extends Item<?>>
(顺便说一下,"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声明的递归性质。然而,这种方法并没有成功。