親愛的,
我有一個父子類:
public class Parent{
protected class Inner{
}
}
public class Child extends Parent{
protected class Inner{
}
}
我想在父類中使用內部子類:
myMethod(Inner inner)
是否將內部類設定為足夠受保護以實作這一目標?
uj5u.com熱心網友回復:
在您提供的代碼中,命名的兩個類Inner完全無關。您只是.. 有兩個類碰巧具有相同的名稱。就像java.awt.Listand java.util.List:是的,同名,但就等價性(它們與槍支和祖母一樣不同)和訪問規則(訪問規則就是它們;它們共享一個名稱與此無關)它)。
他們的名字“正常”,你可以寫Child.Inner和Parent.Inner其分化帶來他們。只是寫Inner將javac的解釋為一種或另一種依賴進口和背景關系(與去括號內Child extends Parent {},它被解釋為Child.Inner由于這是一個相同的檔案兄弟,除非你有一個明確的進口;其他大部分地方它'要么不編譯,要么被解釋為Parent.Inner)。鑒于這些是有些深奧的規則,最好的辦法是不要只Inner在這種情況下撰寫,并且始終是明確的。“但更短的代碼”是一個很好的經驗法則,但之所以稱之為經驗法則,是因為它們并不總是正確的。否則他們只會被稱為“規則”,無需涉及拇指。
但是,在此之前,為什么您首先在同一個專案中有兩個同名的無關類?即使每個人都寫出全名以避免混淆,這也會令人困惑。
你在這里的真正意圖是什么?
我想Child.Inner成為Parent.Inner,鏡像Child和Parent關系的子類
然后這樣寫:
public class Child extends Parent {
public class Inner extends Parent.Inner {}
}
我仍然強烈考慮在這里選擇不同的名字。也許public class ChildInner- 顯然Inner這里只是一個占位符名稱,而不是您專案中真正的名稱,所以我不能就選擇什么名稱提供太多建議。只是那個“同名”是個壞主意。
您Child.Inner有一個Child可用的隱藏命名實體,它是一種更具體的Parent,它本身也是一種更具體的Parent.Inner,這意味著4 個類中的任何一個中的每個方法都可供它使用。如果Parent或Child有一個名為 的方法x(),Parent.Inner或者Child.Inner也有一個名為 的方法x(),您可以使用以下語法進行區分:
Child.this.x();
但是,再一次,為什么你會通過多次使用相同的名字來混淆這樣的事情?
我只希望中的代碼Child能夠從Parent.Inner.
那么你就不會做第二個類,你的意圖顯然不是有擺在首位2的內部類。的每個實體Child都是更具體的Parent,因此您可以創建Parent.Inner其“封閉實體”實際上是 的實體的新實體Child,沒問題。
在Child.java:
Inner inner = new Inner();
除此之外:
Parent.Inner inner = someInstanceOfChild.new Parent.Inner();
自然地,由于 Parent's Inner 中的代碼不知道封閉類的實體是專門用new Parent()一個實體還是某個更具體型別的實體,例如new Child(),不能呼叫僅存在于 Child 中的任何方法,但是您可以instanceof 并投射您的外部此實體:
if (Parent.this instanceof Child) {
Child c = (Child) Parent.this;
c.methodOnlyInChild();
}
作業得很好。
uj5u.com熱心網友回復:
不,
您需要像這樣擴展 Child 類中的 Inner 類:
public class Child extends Parent{
protected class Inner extends Parent.Inner{
這樣你的 myMethod(Inner inner) 將把 Child 類識別為 Parent.Inner 類的子類。否則 Child 類的 Inner 將不是 Parent.Inner 型別(并且不會被識別為該類的子類(或可以在同一方法中使用))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325639.html
上一篇:自定義類不能強制轉換
