任何扩展接口的类都必须实现接口中声明的方法。不确定这是否可行,但我想做的是以下内容:
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;
}
是否可以使用能够返回两种不同数据类型的方法签名?
答案 0 :(得分:14)
不完全相同,但您可以使用泛型类型参数。
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个不同的界面。
答案 1 :(得分:0)
不,这是不可能的。该界面用作&#34;绑定联系人&#34;可用的签名。
如果你想要,你可以让函数返回Object
,并允许不同的实现返回不同类型的值,但是:
答案 2 :(得分:0)
您可以使用泛型执行此操作,但不会在运行时强制执行。您还应该使用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
作为返回类型。
答案 3 :(得分:0)
这个编译,虽然我不确定我建议这样做:
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中使用返回类型覆盖方法是合法的,该返回类型是原始方法的返回类型的子类。这被称为“协方差”。它仅适用于返回类型,而不适用于参数。请注意,要进行编译,我必须在课程get
中A
返回Integer
而不是int
。另外:在实现接口时使用implements
,而不是extends
;并确保在引用变量时使用正确的字母大小写(发布的代码中的Val
不起作用)。
正如我所说的,我不确定我是否推荐这个,因为在任何声明test
类型的代码中,get()
的结果是Object
,你会必须投射其他东西才能使它变得有用。如果可能,应该使用泛型。但是,并非总是可行。在编写这样的界面之前,我会仔细考虑你的设计。可能是界面并不是你想要的。但是,如果没有更多关于你要完成什么的细节,我无法分辨。