java:重载时的不同返回类型

时间:2009-11-08 12:53:34

标签: java types return overloading

我有这样一个类树:

master class abstract class Cell
AvCell extends Cell
FCell extends Cell

我在getValue()

中有一个抽象方法Cell

是否可以让方法getValue()int返回AvCell,为String返回FCell? 我可以为int String使用泛型吗?

谢谢!

8 个答案:

答案 0 :(得分:14)

您可以使用泛型并声明Cell<T>。 然后让getValue()返回T

abstract class Cell<T> {

   abstract T getValue();

}

现在:

class AvCell extends Cell<Integer> {
}

class FCell extends Cell<String> {
}

答案 1 :(得分:8)

没有。但是,您可以在子类化时缩小返回类型。这被称为“协变返回类型”。如果基类中的方法返回T,则允许在子类中重写该方法并使其返回T的子类。

答案 2 :(得分:8)

您可以执行以下操作:

abstract class Cell<T> {
    public abstract T getValue();
}

class AvCell extends Cell<Integer> {
    public Integer getValue() {
        return 0;
    }
}

class FCell extends Cell<String> {
    public String getValue() {
        return "foo";
    }
}

答案 3 :(得分:1)

没有,返回类型没有超载。

如果你真的想要,可以将返回类型声明为Object并返回Integer或String。

答案 4 :(得分:1)

你通常不能 。您必须声明返回类型,并且返回的值应该是声明的类型或子类型。 有其他方法可以做到这一点 - 将方法返回类型声明为Object并返回您想要的任何内容,但这不是可行的方法。

首先,一个非常简单的问题:为什么要根据不同的输入条件返回不同的类型?通常这应该是因为您根据传递的类型在方法中执行两个不同的操作。这是值得一看的地方。对于不同的类型有不同的方法,并根据手头的类型调用其中一种。 (你可以进一步使用工厂模式......)

答案 5 :(得分:0)

如果我正确理解(更改)问题:否

来自Sun Java Tutorial

  

重载方法由传递给方法的参数的数量和类型区分。在代码示例中,draw(String s)和draw(int i)是不同且唯一的方法,因为它们需要不同的参数类型。

     

您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。 “

答案 6 :(得分:0)

您不能重载方法的返回类型。 JVM不知道使用哪种方法,因为签名是相同的。

但是,您可以返回Object,其中一个填写Integer,另一个填充String。

答案 7 :(得分:0)

是的,JVM实际上允许它,所以如果你能正确生成字节码就可以完成。问题是您必须使用除javac之外的其他工具。这是一个很好的教程:http://today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html

为什么重要?我们构建了一个库,但是想要将返回类型从void更改为其他类型。不幸的是,它需要所有依赖它的应用程序来重新编译。通过操作字节代码,旧应用程序可以在不重新编译的情况下运行。