3 回答
TA贡献1906条经验 获得超10个赞
尝试
override def call(context: XPathContext, arguments: Array[Sequence[_ <: Item[_]]]): Sequence[_] = ???
TA贡献1878条经验 获得超4个赞
这绝对是编译的(从而证实了德米特罗·米廷的提议是有效的):
// ExtensionFunctionCall.java
public interface ExtensionFunctionCall {
Sequence<?> call(String ctx, Sequence[] args);
}
// Item.java
public interface Item<T extends Item<?>> {}
// Sequence.java
public interface Sequence<T extends Item<?>> {}
// Impl.scala
class Impl extends ExtensionFunctionCall {
override def call(
ctx: String,
args: Array[Sequence[_ <: Item[_]]]
): Sequence[_] = ???
}
顺便说一句,这不仅仅是斯卡拉的问题。如果你忘记了Scala一秒钟,并尝试在Java中实现它,你得到的基本上是相同的错误:
class ImplJava implements ExtensionFunctionCall {
public Sequence<?> call(
String ctx,
Sequence<?>[] args
) {
return null;
}
}
给:
ImplJava.java:1: error: ImplJava is not abstract and does not override abstract method call(String,Sequence[]) in ExtensionFunctionCall
class ImplJava implements ExtensionFunctionCall {
^
ImplJava.java:2: error: name clash: call(String,Sequence<?>[]) in ImplJava and call(String,Sequence[]) in ExtensionFunctionCall have the same erasure, yet neither overrides the other
public Sequence<?> call(
^
2 errors
现在,这真的很神秘,我不知道如何在Java中写下这种类型。我不确定它是否可以在Java中表达而不恢复到1.4风格。事情是邪恶的,或者,引用德米特罗·米廷链接的这篇精彩文章:Sequence[]
原始类型很糟糕。停止使用它们
TA贡献1789条经验 获得超8个赞
我认为在java中没有类型参数可以转换为最高可能的超类型(在这种情况下)。所以,我希望这样的东西能起作用:Sequence
Sequence[Foo]
Foo
Item
override def call(context: XPathContext, arguments: Array[Sequence[Item[_]]]): Sequence[_] = ???
添加回答
举报