![](/img/trans.png)
[英]Java class has 2 methods with the same function signature but different return types
[英]Interface (two methods, different return types depending on class) Java
扩展接口的任何类都必须实现接口中声明的方法。 不确定这是否可行,但我想做的是以下内容:
interface test {
____ get();
}
class A extends test {
int val;
A(int x) {
val = x;
}
int get() {
return Val;
}
class B extends test {
String val;
B(String x) {
val = x;
}
String get() {
return Val;
}
是否可以使用能够返回两种不同数据类型的方法签名?
不完全相同,但您可以使用泛型类型参数。
interface Test<T> {
T get();
}
class A implements Test<Integer> {
int val;
A(int x) {
val = x;
}
@Override
public Integer get() {
return val;
}
}
class B implements Test<String> {
String val;
B(String x) {
val = x;
}
@Override
public String get() {
return val;
}
}
如您所见,您必然会使用Integer
因为泛型不适用于基元。
另请注意,同一接口的这2个版本现在基本上是2个不同的接口。
不,这是不可能的。 该接口充当可用签名的“绑定联系人”。
如果你想要,你可以让函数返回一个Object
并允许不同的实现返回不同类型的值,但是:
您可以使用泛型执行此操作,但不会在运行时强制执行。 您还应该使用implements
来实现类中的接口,而不是extends
。
interface Test<T> {
T get();
}
class A implements Test<Integer> {
int val;
A(int x) {
val = x;
}
@Override
Integer get() {
return Val;
}
}
class B implements Test<String> {
String val;
B(String x) {
val = x;
}
@Override
String get() {
return Val;
}
}
泛型仅适用于类,因此您不得不使用Integer
而不是int
作为返回类型。
编译,虽然我不确定我建议这样做:
interface test {
Object get();
}
class A implements test {
int val;
public A(int x) {
val = x;
}
public Integer get() {
return val;
}
}
class B implements test {
String val;
public B(String x) {
val = x;
}
public String get() {
return val;
}
}
在Java中使用返回类型覆盖方法是合法的,返回类型是原始方法的返回类型的子类 。 这被称为“协方差”。 它仅适用于返回类型,而不适用于参数。 请注意,要使其编译,我必须在类A
中使get
返回Integer
而不是int
。 另外:在实现接口时使用implements
,而不是extends
; 并确保在引用变量时使用正确的字母大小写(发布的代码中的Val
不起作用)。
正如我所说的,我不确定我是否推荐这个,因为在任何声明类型为test
代码中, get()
的结果是一个Object
,你必须将其转换为其他东西以使其有用。 如果可能,应该使用泛型。 但是,并非总是可行。 在编写这样的界面之前,我会仔细考虑你的设计。 可能是界面并不是你想要的。 但是,如果没有更多关于你要完成什么的细节,我无法分辨。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.