【问题标题】:java: different return types when overloadingjava:重载时的不同返回类型
【发布时间】:2010-12-14 08:33:29
【问题描述】:

我有一个这样的类树:

master class abstract class Cell
AvCell extends Cell
FCell extends Cell

我在Cell 中有一个抽象方法getValue()

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

谢谢!

【问题讨论】:

  • 你的意思是覆盖,而不是重载。

标签: java types return overloading


【解决方案1】:

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

abstract class Cell<T> {

   abstract T getValue();

}

现在:

class AvCell extends Cell<Integer> {
}

和

class FCell extends Cell<String> {
}

【讨论】:

【解决方案2】:

没有。但是,您可以在子类化时缩小返回类型。这被称为“协变返回类型”。如果基类中的方法返回 T,您可以在子类中覆盖该方法并让它返回 T 的子类。

【讨论】:

    【解决方案3】:

    您可以执行以下操作:

    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";
        }
    }
    

    【讨论】:

      【解决方案4】:

      不,返回类型没有重载。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          如果我正确理解(不断变化的)问题:否

          来自Sun Java Tutorial:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 2011-01-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多