gpt4 book ai didi

java - 转换为有界类型

转载 作者:行者123 更新时间:2023-12-01 05:28:46 24 4
gpt4 key购买 nike

我有一个类层次结构,其中表兄弟共享非常相似的功能。例如:

Node
Statement
FunctionCallStatement
Expression
FunctionCallExpression

FunctionCallStatement 和 FunctionCallExpression 共享一个非常相似的 API,但我无法用单继承层次结构用纯类术语来表达它。因此,我创建了一个 IsFunctionCall 接口(interface),这两个接口(interface)都实现了。我现在可以声明一个采用 FunctionCallStatement 或 FunctionCallExpression 的方法,如下所示:

void <T extends Node & IsFunctionCall> doSomething(T node) { ... }

这一切都非常有效。

不幸的是,我现在发现自己面临着一个相当尴尬的问题。我有一个节点;我动态地知道它必须是 FunctionCallStatement 或 FunctionCallExpression;我需要将该节点传递到上面的 doSomething() 方法中。我找不到将其升级为适当类型的方法。

现在我正在使用一连串的instanceof来确定Node是哪个类并将其转换为适当的具体类型,但这很丑陋。我知道实现这项工作的唯一其他方法是创建一个 IsNode 接口(interface),并让当前需要 Node 的所有内容都需要 IsNode;这将允许我声明一个实现 IsNode 和 IsFunctionCall 的联合接口(interface),并且让我无需使用上面的泛型。但这是一项繁重的工作,而且仍然很丑陋。

有其他方法可以做到这一点吗?

(注意:上面的示例是我的实际代码的简化版本。)

更新:我尝试了以下邪恶的方法:

@SuppressWarnings("unchecked")
private <S extends Node & IsFunctionCall> S castNode(Node node)
{
return (S) node;
}

然后:

doSomething(castNode(node));

我收到一些非常奇怪的错误消息。看起来用于确定 castNode() 的 S 的类型推断将与 doSomething() 声明中的 T 不匹配;它仅使用具体类型并将 S 设置为 Node。这当然与 doSomething() 的声明类型不匹配。非常奇特。

更新更新:

这似乎与 How should I cast for Java generic with multiple bounds? 非常接近。 。我的情况略有不同,因为我的边界包括一个对象和一个接口(interface),而另一个问题中的边界有两个接口(interface),但它仍然适用。

看来我需要重新设计我的整个应用程序。叹息。

任何管理员,请随时将其作为重复项关闭...

最佳答案

我认为解决这个问题的方法虽然不是很优雅,但就是对 doSomething 进行一些重载:

void doSomething(FunctionCallStatement node) ...
void doSomething(FunctionCallExpression node) ...

关于java - 转换为有界类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9349203/

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