gpt4 book ai didi

java - 如何调用泛型对象的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:50 24 4
gpt4 key购买 nike

下面的代码给出了错误:

SceneNode.java:17: cannot find symbol
symbol : method execute() location:
class java.lang.Object
operation.execute();
^ 1 error

代码:

import java.util.LinkedList;
import java.util.Iterator;

public class SceneNode<T>{
T operation;
public SceneNode() {
}
public SceneNode(T operation) {
this.operation = operation;
}
public void setOperation(T operation) {
this.operation = operation;
}
public void doOperation() {
operation.execute();
}
}

这是一个简单场景图的缩减版(为了您的可读性)。节点可以是模型、转换、开关等,所以我创建了一个名为 operation 的变量,其类型由 T 类变量定义。这样我就可以传递一个 Transformation/Model/Switch 对象(它有一个 execute 方法)并传递它像这样:

SceneNode<Transformation> = new SceneNode<Transformation>(myTransformation);

我很确定拥有 SceneNode 的基类并为所有各种类型的节点创建子类会是一个更好的主意(我正在尝试泛型,最近才了解它们)。为什么这不起作用?我一定遗漏了关于泛型的一些基本知识。

最佳答案

它不起作用,因为 T可以是任何类型,而 Java 是静态类型的。编译器不知道你是否会尝试创建一个 SceneNode<String> - 那么会怎样 execute做什么?

一个选择是创建一个合适的界面,例如

public interface Executable {
void execute();
}

然后约束TSceneNode实现Executable :

public class SceneNode<T extends Executable> {
...
}

(我觉得有点奇怪 T 必须扩展 Executable 而不是在源代码中实现它,但是 T 可以最终成为一个界面本身,所以我想这是有道理的。)

那么它应该可以正常工作。当然你可以制作Executable一个抽象父类(super class) - 或者甚至是(非最终的)具体类 - 如果你愿意的话,但我通常更愿意使用接口(interface),除非我有一些理由不这样做。

关于java - 如何调用泛型对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129685/

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