当前位置: 首页 > 知识库问答 >
问题:

java中抽象方法的不同返回类型

孙修德
2023-03-14

我正在尝试实现和重写具有不同返回类型的方法,而不会被迫转换返回类型。

public abstract class A {
public abstract Object getValue(String content);
}

public class B extends A {
public String getValue(String content) {...}
}

public class C extends A {
public int getValue(String content) {...}
}


public class D extends A {
public boolean getValue(String content) {...}
}

// Main loop:
for (A a : allAs)
{
// I want to use the method getValue() and corresponding to the type return a String, int or boolean without casting the return type
}

我的问题:是否可以在不强制强制转换的情况下返回不同的类型?解决这个问题的抽象方法看起来怎么样?

我认为必须有一个解决方案,因为编译器应该知道返回类型...

共有3个答案

蔡弘扬
2023-03-14

您可以使用泛型。

public abstract class A<T> {
   public abstract T getValue(String content);
}

public class B extends A<String> {
   public String getValue(String content) {...}
}

etc.int不能作为返回类型,但Integer可以。

我不是在编译器上打字,所以可能会有打字错误...

正如Jim和Chris所指出的,如果你循环As,你只能得到" A "结果,也就是Object。

方风华
2023-03-14

你描述的一般是不可能的。然而,如果子类返回超类方法返回的“更窄”的子类型,这被称为“协变返回类型”,并且从JDK 1.5开始在Java中被允许。然而,基于你的例子,我不认为协变回报是你所寻找的。

我想你想要的是

for (A a : allAs)
{
    String b = a.getValue();
    int    c = a.getValue();
}

当然,这里的问题是,编译器无法在编译时知道这两个语句中的哪一个是正确的,并且它们不可能都是正确的。

薛滨海
2023-03-14

在您的示例中,类CD将无法编译。它们中被覆盖的方法违反了Liskov替换原则,也就是,它们的返回类型与其父类不兼容。只要您愿意放弃使用原语作为返回类型,您想要做的事情可以用泛型来完成。

abstract class A<T> {
    public abstract T getValue(String content);
}

class B extends A<String> {
    public String getValue(String content) { }
}

class C extends A<Integer> {
    public Integer getValue(String content) { }
}

class D extends A<Boolean> {
    public Boolean getValue(String content) { }
}
 类似资料:
  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

  • 我是java新手,我正在学习抽象课程,但我被困在了一个地方。 我想将不同的数据类型返回到,但我做不到。我确实在java中参考了抽象方法的不同返回类型,但没有提出这个问题,因为我在java方面的经验较少,因此我不明白该链接的solution.Please有人帮我解决这个问题。 密码 错误 测试.java:18: 错误: 联合不是抽象的, 不会覆盖抽象方法率对银行的兴趣() 类Union扩展Bank{

  • 本文向大家介绍JAVA利用泛型返回类型不同的对象方法,包括了JAVA利用泛型返回类型不同的对象方法的使用技巧和注意事项,需要的朋友参考一下 有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象。此时就需要用到泛型。 首先先解释个概念, 元组:它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改。 利用泛型创建元组 测试 输出

  • 问题内容: 。 将返回String和int值。因此,我从这些返回值中得出了以下解决方案。 建立课程通话 并进行如下更改。 现在我的问题是,有没有更简单的方法来实现这一目标? 问题答案: 最后,我认为我的方法会更好,因为当返回类型的数量增加时,这种实现会以最佳方式实现。

  • . 将返回字符串和int值。从中获取这些返回值,我想出了以下解决方案。 创建一个类调用返回值 并更改,如下所示。 现在我的问题是,有没有更简单的方法来实现这一点??

  • 想象一下,我有一个抽象类动物的方法: 然后我有一个类,用以下内容扩展这个抽象类: 我希望每个扩展Animal的类都有一个fetch()方法。然而,fetch方法为相关动物指定了一些独特的特征(狗的爪子、猫的爪子等)。例如,cat的fetch()将获取参数fetch(fellinecat kitty)并表示: 因此,抓取方法接受了扩展抽象类“动物”(因此是动物)的参数。我在“动物”中定义了抓取()方