[問題] 如何帥帥地 downcast ?
起因我想要繼承某個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
08/11 10:29, 1F
→
08/11 10:32, , 2F
08/11 10:32, 2F
→
08/11 10:34, , 3F
08/11 10:34, 3F
ring 就掛啦
→
08/11 10:43, , 4F
08/11 10:43, 4F
可以嚴肅點嗎,不要喧鬧好嗎
聽無
→
08/11 10:55, , 5F
08/11 10:55, 5F
→
08/11 11:38, , 6F
08/11 11:38, 6F
→
08/11 11:42, , 7F
08/11 11:42, 7F
→
08/11 11:42, , 8F
08/11 11:42, 8F
因為父沒有實作ring 甚至根本沒有ring,所以phone沒有ring 很合理阿!
我再說明一次, 可能我沒有表達清楚
我要繼承某Class, 並且替他增加Method,
在OO上這作法很合理, 但實際運用時又會碰上CastException,
我真的不懂...所以誠心發問
→
08/11 13:00, , 9F
08/11 13:00, 9F
→
08/11 13:00, , 10F
08/11 13:00, 10F
→
08/11 13:00, , 11F
08/11 13:00, 11F
→
08/11 13:01, , 12F
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
08/11 14:36, 14F
→
08/11 14:36, , 15F
08/11 14:36, 15F
→
08/11 14:36, , 16F
08/11 14:36, 16F
→
08/11 14:36, , 17F
08/11 14:36, 17F
我試了 結果...
Paper p = (Paper) d; 這行castException
推
08/11 16:00, , 18F
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
08/11 17:02, 19F
→
08/11 17:08, , 20F
08/11 17:08, 20F
您說的沒錯,工很大,謝謝你,好像目前也只能這麼做了
→
08/11 17:38, , 21F
08/11 17:38, 21F
→
08/11 17:38, , 22F
08/11 17:38, 22F
※ 編輯: pttnews (49.217.82.145), 08/11/2015 17:57:01
→
08/11 17:57, , 23F
08/11 17:57, 23F
→
08/11 17:58, , 24F
08/11 17:58, 24F
謝謝~又多學一招
→
08/11 18:25, , 25F
08/11 18:25, 25F
→
08/11 18:26, , 26F
08/11 18:26, 26F
→
08/11 18:27, , 27F
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
08/12 14:43, 28F
→
08/13 10:27, , 29F
08/13 10:27, 29F
java 近期熱門文章
PTT數位生活區 即時熱門文章