[問題] 如何帥帥地 downcast ?

作者: pttnews (PTT新聞)   2015-08-11 10:18:13
起因我想要繼承某個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");
}
}
作者: ssccg (23)   2015-08-11 10:29:00
new phone()就是new了一個phone,怎麼會是downcast除非你還有其他種phone,不然一直用android不就好了android就繼承了phone了,可以run()啊
作者: swpoker (swpoker)   2015-08-11 10:43:00
父不父,子不子,怎麼看都亂倫阿
作者: realmeat (真肉)   2015-08-11 10:55:00
推亂倫 XD
作者: swpoker (swpoker)   2015-08-11 11:38:00
父 物件=new 子()phone沒有ring嗎?我覺得OO的很怪阿?繼承或動態都不是乾脆你用annotation好了
作者: ssccg (23)   2015-08-11 13:00:00
你全程變數類型都用android有問題? android有ring怎麼會掛原本需要phone的地方直接傳android object進去也不用castandroid is phone, phone is not androidcast只是轉reference型態,object new的時候是什麼就是什麼
作者: ckvir (ckvir)   2015-08-11 14:36:00
應該要這樣吧Doc d = new Paper()d = jsoup. parse(... )Paper p = (Paper) dp. newM()
作者: cowbaying (是在靠北喔)   2015-08-11 16:00:00
要不要弄個介面去繼承phone 然後再實作ring?
作者: ssccg (23)   2015-08-11 17:02:00
回傳回來的就是Document不是Paper,只能寫個東西去轉換Paper p = new Paper(doc),然後自己把field copy過去通常是把Paper做成wrapper(你說的doc當成member)但是一定要維持type是Document的話工也滿大的
作者: qrtt1 (有些事,有時候。。。)   2015-08-11 17:57:00
別傻的 copy 啊,IDE 有 generate delegate methods 啊https://www.youtube.com/watch?v=l0cecpSHRkE
作者: ssccg (23)   2015-08-11 18:25:00
看了一下jsoup source,parse可以傳Parse進去,Parse是用TreeBuilder,然後Document是在initialiseParse new的也可以subclass TreeBuilder把doc的type換掉再拿來用
作者: swpoker (swpoker)   2015-08-13 10:27:00
(BXX)((Object)a)

Links booklink

Contact Us: admin [ a t ] ucptt.com