[問題] 如何帥帥地 downcast ?

看板java作者 (PTT新聞)時間10年前 (2015/08/11 10:18), 10年前編輯推噓2(2027)
留言29則, 6人參與, 最新討論串1/1
起因我想要繼承某個api framework, 替他增加某些Method, 但是現在做不下去, 所以做一個testcase, 如果我先upcast, 然後要用到ring再downcast, 可以成功, 但是我不喜歡這作法 phone pp = (phone) new android(); pp.run(); ((android)pp).ring(); 我想要這樣做 ,但是在 b= (android)new phone(); 這一行, 會出現 java.lang.ClassCastException: phone cannot be cast to android android b= (android)new phone(); b.run(); b.ring(); 請問版上高手, 如何帥帥地向下轉型? 原始馬 import org.junit.After; import org.junit.Before; import org.junit.Test; public class extend { @Test public void extendDownCast(){ android b = new android(); if (b instanceof phone) { b= (android)new phone(); b.ring(); } } } class phone { public void run() { System.out.print("run"); } @Override public boolean equals(Object o) { if(!(o instanceof phone)) return false; return true; } } class android extends phone { public void ring() { System.out.print("ring"); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.82.145 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1439259495.A.03D.html

08/11 10:29, , 1F
new phone()就是new了一個phone,怎麼會是downcast
08/11 10:29, 1F

08/11 10:32, , 2F
除非你還有其他種phone,不然一直用android不就好了
08/11 10:32, 2F

08/11 10:34, , 3F
android就繼承了phone了,可以run()啊
08/11 10:34, 3F
ring 就掛啦

08/11 10:43, , 4F
父不父,子不子,怎麼看都亂倫阿
08/11 10:43, 4F
可以嚴肅點嗎,不要喧鬧好嗎 聽無

08/11 10:55, , 5F
推亂倫 XD
08/11 10:55, 5F

08/11 11:38, , 6F
父 物件=new 子()
08/11 11:38, 6F

08/11 11:42, , 7F
phone沒有ring嗎?我覺得OO的很怪阿?繼承或動態都不是
08/11 11:42, 7F

08/11 11:42, , 8F
乾脆你用annotation好了
08/11 11:42, 8F
因為父沒有實作ring 甚至根本沒有ring,所以phone沒有ring 很合理阿! 我再說明一次, 可能我沒有表達清楚 我要繼承某Class, 並且替他增加Method, 在OO上這作法很合理, 但實際運用時又會碰上CastException, 我真的不懂...所以誠心發問

08/11 13:00, , 9F
你全程變數類型都用android有問題? android有ring怎麼會掛
08/11 13:00, 9F

08/11 13:00, , 10F
原本需要phone的地方直接傳android object進去也不用cast
08/11 13:00, 10F

08/11 13:00, , 11F
android is phone, phone is not android
08/11 13:00, 11F

08/11 13:01, , 12F
cast只是轉reference型態,object new的時候是什麼就是什麼
08/11 13:01, 12F
是這樣的.. 我用org.jsoup 這個framework ,用jsoup來Parse Html File, 也就是把html轉object 如何轉換呢? org.jsoup.nodes.Document doc = jsoup.parse(file.getPath()); 所以我得到一個 doc Object, 裡面有html File全部的tag Object 我想要幫 Document 增加新的Method, 叫做 newM 所以 new Paper() extends Document, Paper裡面有 newM 如果我把 org.jsoup.nodes.Document doc = jsoup.parse(file.getPath()); 那行改成 Paper paper = (Paper)jsoup.parse(file.getPath()); 肯定castException PS:jsoup.parse只會rerten Document 如果我改成 Document paper = new Paprt(file.getPath()); paper = Jsoup.parse((file.getPath()); Element hardDiv = paper.hade(); 都沒問題 但是一旦呼叫newM, 就像這樣 ((Paper)paper).newM(); castException 就會在RunTime時跑出來 我知道如果把 Document 放在Paper class 當成member,不要用extend, 就萬事OK 但是我就是想用extend, 該怎麼辦呢? ※ 編輯: pttnews (49.217.82.145), 08/11/2015 13:43:05

08/11 14:36, , 13F
應該要這樣吧
08/11 14:36, 13F

08/11 14:36, , 14F
Doc d = new Paper()
08/11 14:36, 14F

08/11 14:36, , 15F
d = jsoup. parse(... )
08/11 14:36, 15F

08/11 14:36, , 16F
Paper p = (Paper) d
08/11 14:36, 16F

08/11 14:36, , 17F
p. newM()
08/11 14:36, 17F
我試了 結果... Paper p = (Paper) d; 這行castException

08/11 16:00, , 18F
要不要弄個介面去繼承phone 然後再實作ring?
08/11 16:00, 18F
可是瑞凡 interface 不能繼承 phone, 我也不能做一個interface 讓 doc implements 這等於去改別人的framework阿... ※ 編輯: pttnews (49.217.82.145), 08/11/2015 16:28:00

08/11 17:02, , 19F
回傳回來的就是Document不是Paper,只能寫個東西去轉換
08/11 17:02, 19F

08/11 17:08, , 20F
Paper p = new Paper(doc),然後自己把field copy過去
08/11 17:08, 20F
您說的沒錯,工很大,謝謝你,好像目前也只能這麼做了

08/11 17:38, , 21F
通常是把Paper做成wrapper(你說的doc當成member)
08/11 17:38, 21F

08/11 17:38, , 22F
但是一定要維持type是Document的話工也滿大的
08/11 17:38, 22F
※ 編輯: pttnews (49.217.82.145), 08/11/2015 17:57:01

08/11 17:57, , 23F
別傻的 copy 啊,IDE 有 generate delegate methods 啊
08/11 17:57, 23F

08/11 17:58, , 24F
謝謝~又多學一招

08/11 18:25, , 25F
看了一下jsoup source,parse可以傳Parse進去,Parse是用
08/11 18:25, 25F

08/11 18:26, , 26F
TreeBuilder,然後Document是在initialiseParse new的
08/11 18:26, 26F

08/11 18:27, , 27F
也可以subclass TreeBuilder把doc的type換掉再拿來用
08/11 18:27, 27F
HtmlTreeBuilder 的 constructor is not public 只要new 或是 subclass 都會遇到 The constructor HtmlTreeBuilder() is not visible 謝謝你~我學到很多 ※ 編輯: pttnews (220.135.143.146), 08/11/2015 22:07:31

08/12 14:43, , 28F
也不是private,真的要做的話放到同一個package下就可
08/12 14:43, 28F

08/13 10:27, , 29F
(BXX)((Object)a)
08/13 10:27, 29F
文章代碼(AID): #1LoLjd0z (java)
文章代碼(AID): #1LoLjd0z (java)