2014-09-26 31 views
1

我有一個基類這樣的:如何在強制強制轉換受保護對象的超類時拋出警告?

class Base { 
    protected Object a; 

    Base(Object a) { 
     this.a = a; 
    } 
} 

,然後,一個daugher類:

class Daugher extends Base { 
    /* 
    ... some attributes .... 
    */  

    Daughter(Pair<L, R> a) { 
     super(a); 

    /* 
    .... some methods .... 
    */ 

    public void mathodX() { 

     .... 
     ((Pair <L, R>) a).getLeft().SomeSpecificMethodOfObjectTypeL() 
     .... 
    } 

} 

注:對具體爲org.apache.commons.lang3.tuple.Pair對象,但我想同樣適用於其他結構,如地圖,列表等...

因此,如果我想使用強制對象類型的特定方法,我不得不做上述的醜陋鑄造。 但是,這個轉換會在Eclipse中引發「未經檢查的轉換」警告,所以它不太好。 如果我嘗試插入一個支票(例如「if(一個對的實例)」等)...我被告知我不能使用instanceof檢查與特定的任務,但我應該檢查與Pair。但是這不會毫無意義,因爲那麼我想要達到L(或R)特有的方法嗎?

從更廣泛的意義上講,在超類中操縱受保護的通用對象的最正確方法是什麼?

我很抱歉如果沒有以最好的方式說明問題,我不是Java專業人員。

感謝您的幫助!

+0

實際上,你可以不知道肯定'了'是'對'。既然它不是最終的,它可能已經被改變了,你知道,編譯器是正確的,可以警告你。 – resueman 2014-09-26 14:03:08

+0

是的,我理解你的觀點,我明白爲什麼編譯器會提出警告 - 我只是想知道檢查對象a是否是Pair 的一個實例是最正確的方法。 – CaptainPhlegm 2014-09-26 14:51:25

回答

5

一條路可走的是使用泛型:

class Base<T> { 
    protected T a; 

    Base(T a) { 
     this.a = a; 
    } 
} 

class Daugher<L, R> extends Base<Pair<L, R>> { 
    Daugher (Pair<L, R> a) { 
     super (a); 
    } 
} 
+0

這工作很好,謝謝! – CaptainPhlegm 2014-09-29 08:05:51

2

添加註釋

@SuppressWarnings("unchecked") 

到你的方法或抑制這種類型的警告

+0

這實際上是Eclipse建議做的事情,但看起來像是對我的不良編程行爲的掩飾:( – CaptainPhlegm 2014-09-26 14:54:01

0

是的,你能做到以上或你可以用不同的方式聲明methodx。

public <L,R> void methodX{ 

} 

然後,編譯器強制執行該類型。

退房generic programming

+0

Tnx,將檢查出來! – CaptainPhlegm 2014-09-26 14:55:18

相關問題