![](/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.