gpt4 book ai didi

java - 为什么我的自绑定(bind)泛型类型与方法调用不匹配?

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

我正在为命令 shell 编写代码,如下所示:

interface Context<C extends Context<C>> {}

interface RecursiveContext<C extends RecursiveContext<C>> extends Context<C> {
Shell<C> getShell();
default Result execute(Command cmd) { return getShell().execute(cmd, this); }
}

interface Shell<C extends Context<C>> {
C newContext();
Result execute(Command cmd, C context);
}

我在默认方法中收到错误消息

The method execute(Command, C) in the type Shell<C> is not applicable for the arguments (Command, RecursiveContext<C>)

我希望这能起作用,因为 Shell<C> getShell()保证能够接受C在其 execute打电话,因为 this实际上保证是相同自绑定(bind)类型 C 的子类型,但编译器似乎不同意我的观点。哪里不匹配,在默认方法中执行强制转换是否安全?如果这不安全,您能提供类型不匹配的反例吗?

我还尝试在 shell 中引入中间类型 <D extends C> execute(Command, D) ,但这似乎并没有改变任何事情。

(大多数建议的问题都涉及原始类型的中间步骤,但我认为我没有错过这一点。)

最佳答案

这里问题的核心是 CRecursiveContext不是真的Self - 实现类的类型。 Java中没有这样的东西,而这个RecursiveContext<C extends RecursiveContext<C>>这只是解决这个问题的一个技巧,而这就是这个技巧的失败之处。

假设我有 AB 。这是有效的:

class A implements RecursiveContext<B> {

@Override
public Shell<B> getShell() {
return new ShellB();
}
}
class B implements RecursiveContext<B> {

@Override
public Shell<B> getShell() {
return null;
}
}

class ShellB implements Shell<B>{
@Override
public B newContext() {
return new B();
}

@Override
public Result execute(Command cmd, B context) {
return new Result();
}
}

我可以做到这一点:

new A().execute(new Command());

现在execute会通过this ,这是 A 的一个实例,进入ShellB.execute !

有人会真正实现 RecursiveContext像那样?我想不会吧! 人们理解这一点RecursiveContext<C extends RecursiveContext<C>>模式并“接受暗示”。编译器不会(因为自限泛型类型在技术上不是语言功能),并显示 C仍然可能与 this 类型不同.

关于java - 为什么我的自绑定(bind)泛型类型与方法调用不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64453876/

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