2012-11-06 27 views
0

說我有以下功能:從正在返回的界面投射?它總是安全嗎?

public Set<String> giveUp() 
{ 
    Set<String> alreadyGuessed = guessed; 
    guessed = new LinkedSet<String>(); 

    //fill Guessed with possible words 
    anag(currentWord, ""); 

    //Remove ones already guessed 
    Iterator<String> alGuessIterator = alreadyGuessed.iterator(); 
    while (!alGuessIterator.done()) 
    { 
     guessed.remove(alGuessIterator.get()); 
     alGuessIterator.advance(); 
    } 

    return guessed; 
} 

當我調用此函數,並嘗試使用線它來存儲,如:

LinkedSet<String> notGuessed = (LinkedSet<String>)wordGame.giveUp(); 

這會不會永遠是安全的,無論內部函數實現的以上?換句話說,無法猜測是一個ArraySet,它仍然保持一個完全安全的演員?還是我誤解了界面被返回的一點,我只是應該有「Set notGuessed」以防止需要投射?

我的老師在關於課程的問題上毫無用處,如果我做了任何不安全的演員,我也會立刻給我一個0。

+0

「我的老師在關於課堂的問題上毫無用處」 - 這有點粗魯。如果他讀到這個,你認爲會發生什麼? –

回答

2

這不會是安全的,因爲你不能確定的基本類型。如果你只需要訪問由Set接口定義的方法,那麼你應該使用:

Set<String> set = wordGame.giveUp(); 

如果發生這種情況是一個LinkedSet您的代碼將「工作」,但如果沒有,你會得到一個ClassCastException。如果您因爲任何原因需要它爲LinkedSet,那麼giveUp()方法應該明確返回LinkedSet

+0

太棒了。很高興看到我的兩個理論中至少有一個是正確的。感謝您提供拋出的異常。注意未來。 – Patrick

0

不,您的演員陣容將失敗,並且ClasscastException除非返回類型與您正在投射的類型完全相同。

閱讀此篇瞭解why program to an interface

+0

非常感謝您的鏈接。如果我的老師真的鼓勵了班級,而不是吹噓他寫的教科書,這將是非常棒的。 – Patrick

+0

很高興幫助你。享受編碼。 – kosa

0

不,您正在返回設置並投射到LinkedSet。

如果更改

Set<String> alreadyGuessed = guessed; 
guessed = new LinkedSet<String>(); 

Set<String> alreadyGuessed = guessed; 
guessed = new HashSet<String>(); 

,你將有一個ClassCastException。

鏈接集是集,但集不一定是鏈接集。除非您在代碼中使用特定於Linkedset的方法,否則只需刪除演員表。

0

如果您只使用本地使用的全局字段,那麼您的服務將會更好。在這種情況下,您應該在本地聲明guessed,然後anag返回一些內容。

將事物保持在正確的範圍內有時很煩人,但是可以防止您在這裏處理的確切混淆。

只要你問到的實際問題,該方法返回LinkedSet,那麼你不必擔心鑄造。

+0

感謝您的意見......但與問題完全無關。 只是你知道,這是在一個GUI和一個類之間。它意味着在彼此之間超出範圍。 – Patrick

+0

放棄不應該做更多猜測的工作!每種方法應該有一個任務。要做更復雜的任務,建立更多的方法。一個方法應該完全按照它的名稱來做。這樣,在調試的時候,你可以閱讀一個方法調用並且說「噢,我知道它做了什麼」 - 但是當你編寫代碼的時候,方法的作用不止於此,你不知道什麼會發生什麼並且弄糊塗了,如上所述。 – durron597

0

返回接口引用類型的全部想法是,所有用戶都應該對它提供的方法感到滿意,而不必擔心底層實現。如果你必須演員,你做錯了。

+0

是的,因此我問這個問題,如果我只能返回接口。我沒有意識到Java只允許在從方法中的return語句獲取它時聲明一個接口。 – Patrick