我有这样一个类树:
master class abstract class Cell
AvCell extends Cell
FCell extends Cell
我在getValue()
Cell
是否可以让方法getValue()
为int
返回AvCell
,为String
返回FCell
?
我可以为int
String
使用泛型吗?
谢谢!
答案 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)
如果我正确理解(更改)问题:否
重载方法由传递给方法的参数的数量和类型区分。在代码示例中,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更改为其他类型。不幸的是,它需要所有依赖它的应用程序来重新编译。通过操作字节代码,旧应用程序可以在不重新编译的情况下运行。