gpt4 book ai didi

Java:如果抽象类Foo返回Object,具体类Bar可以返回String或Integer吗?

转载 作者:行者123 更新时间:2023-12-01 21:47:12 25 4
gpt4 key购买 nike

我有一个带有抽象类的 Java 枚举,如下所示:

public enum Strategy {
STRING {
@Override
public String execute() {
return "ABCDE";
}
},
INTEGER {
@Override
public Integer execute() {
return 12345;
}
};
public abstract Object execute();
}

当我使用它时,我希望能够做到这一点:

String text = Strategy.STRING.execute();
Integer num = Strategy.INTEGER.execute();

但是,我的 IDE 警告我这些是不兼容的类型,并且无法编译。要解决这个问题,我必须这样做:

String text = (String) Strategy.STRING.execute();
Integer num = (Integer) Strategy.INTEGER.execute();

我不想强制转换 execute() 方法的结果。有没有办法返回具体方法签名中指定的类型,而不是返回 Object

最佳答案

当您重写方法时,可以声明子类方法以返回父类(super class)返回类型的细化。但是,调用父类(super class)方法的代码无法知道返回对象的实际类型。就您而言,它只知道它是某种Object。这就是为什么您必须在分配给更具体的变量之前对其进行强制转换。

枚举对象有点奇怪。当您编译此代码时:

Strategy.STRING.execute();

编译器生成此字节码(从 javap -c 输出):

getstatic     #2 // Field Strategy.STRING:LStrategy;
invokevirtual #3 // Method Strategy.execute:()Ljava/lang/Object;

如您所见,它将 Strategy.STRING 视为 Strategy 类的静态字段,并且该字段的类型为 Strategy。因此,尽管表面上看起来,调用代码并不知道它正在调用 execute()STRING 版本。

不过,我想知道你为什么要做这一切。设计一个需要强制转换的 API 似乎违背了面向对象编程的精神。

关于Java:如果抽象类Foo返回Object,具体类Bar可以返回String或Integer吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22545933/

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