時,我有一個分類是這樣的:java的:不同的返回類型超載
master class abstract class Cell
AvCell extends Cell
FCell extends Cell
我有一個抽象方法getValue()
在Cell
是否posibble使方法getValue()
爲AvCell
返回int
和String
爲FCell
? 我可以使用泛型爲int
String
?
謝謝!
時,我有一個分類是這樣的:java的:不同的返回類型超載
master class abstract class Cell
AvCell extends Cell
FCell extends Cell
我有一個抽象方法getValue()
在Cell
是否posibble使方法getValue()
爲AvCell
返回int
和String
爲FCell
? 我可以使用泛型爲int
String
?
謝謝!
如果我理解的(變化)問題正確:沒有
重載方法是由數量和傳遞到方法的參數的類型來區分。在代碼示例中,draw(String s)和draw(int i)是不同且唯一的方法,因爲它們需要不同的參數類型。
您不能聲明多個具有相同名稱和相同數量和類型的參數的方法,因爲編譯器無法區分它們。 「
您可以使用仿製藥,並聲明Cell<T>
這時正好有getValue()
返回T
abstract class Cell<T> {
abstract T getValue();
}
現在:
class AvCell extends Cell<Integer> {
}
和
class FCell extends Cell<String> {
}
不可以,但是,可以在子類化時縮小返回類型。這被稱爲「協變返回類型」。如果基類中的方法返回T,則允許在子類中覆蓋該方法,並讓它返回T的子類。
不可以,返回類型不會重載。
如果您確實想要,您可以聲明返回類型爲Object,並返回Integer或String。
你不能那樣做通常。您必須聲明返回類型,並且返回的值應該是聲明的類型或子類型。 還有其他這樣做的方法 - 聲明方法返回類型爲Object並返回任何你想要的,但這不是要走的路。
首先,一個非常簡單的問題:爲什麼要根據不同的輸入條件返回不同的類型?通常這應該是因爲你正在根據你傳遞的類型在方法中做兩件不同的事情。這是要看的地方。針對不同類型有不同的方法,並根據手頭的類型調用其中的一種。 (你可以進一步使用工廠模式...)
你不能重載方法的返回類型。JVM不知道使用哪種方法,因爲簽名是相同的。
但是,您可以返回Object,其中一個填充Integer和另一個String。
你可以做到以下幾點:
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";
}
}
是,JVM實際上允許了,所以這是可以做到,如果你能正確地生成的字節碼。問題是你必須使用javac以外的其他工具。這裏有一個很好的教程:http://today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html
爲什麼它很重要?我們建立了一個庫,但想將返回類型從void改爲其他。不幸的是,它要求所有依賴它的應用程序重新編譯。通過操縱字節代碼,舊的應用程序可以運行而無需重新編譯。
你的意思是覆蓋,而不是重載。 – 2009-11-08 13:04:39