我試圖盡可能減少我的一段代碼來說明我的問題。所以...
這段代碼不會“做”任何事情。我的意思只是問是否有可能在下面的示例中needsCasting() 無需強制轉換即可訪問該方法?
這肯定與編譯器“看到”的內容有關,以及對他來說CustomTreeItem和它的 parent之間的區別是什么TreeItem<Dummy>。
我的研究結果是,TreeItem班級內的“隱藏”串列孩子是TreeItem<Dummy>,而不是CustomTreeItem,但我的問題是完整的:“有沒有辦法直接訪問子方法(不進行強制轉換)?”
下面是例子:
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableRow;
public class CastingQuestion {
public class Dummy extends TreeTableRow<Dummy> {
}
public final class CustomTreeItem extends TreeItem<Dummy> {
private void needsCasting() {
System.out.println("Hello world");
}
public void listChildren() {
for (TreeItem<Dummy> item : getChildren()) {
((CustomTreeItem) item).needsCasting();
}
}
}
}
uj5u.com熱心網友回復:
如果您有一個型別為 的變數TreeItem<Dummy>,則必須CustomTreeItem先將其強制轉換為CustomTreeItem物件,才能訪問其特定的方法或屬性。這是因為編譯器只知道變數的型別TreeItem<Dummy>不一定是CustomTreeItem.
假設我有兩個類,TreeItemA并且TreeItemB- (extending from) 的兩個子類TreeItem<Dummy>。我有一個型別的變數TreeItem<Dummy>。
TreeItem<Dummy> item;
這個變數可以是TreeItemAor 的一個實體TreeItemB:
item = new TreeItemA(); //valid assignment
item = new TreeItemB(); //valid assignment
因此,TreeItem如果不強制轉換為子類,則只能訪問基類中變數的屬性或方法- 這完全取決于您正在使用的變數的型別。
編輯:值得注意的是,getChildren()您正在呼叫的方法CustomTreeItem回傳ObservableList<TreeItem<T>>(根據默認TreeItem實作)。這意味著當您遍歷從 回傳的串列時getChildren(),每個元素都將屬于 型別TreeItem<Dummy>。
uj5u.com熱心網友回復:
注意:呼叫子類的方法是違反OOP的。
你的問題的答案是否定的。父類不知道您的子類方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346219.html
上一篇:帶有列舉模板引數的模板類的工廠
下一篇:具有嵌套類的類的Python行為
