2008-11-26 45 views
2

的跟進我previous question 經與結合的通用範圍,如函數:是否結合泛型邊界反模式?

<T extends Foo & Bar> void doStuff(T argument) { 
    //do stuff wich should only be done if arguments is both foo and bar 
} 

因爲這不是從一個不明物體澆注料,你需要有這實際上實現這些接口的一些對象的知識。在我看來,需要知道傳遞給doStuff(T a)的對象參數的具體類型是違反德米特定律的。

功能不指定需要知道實際的類(可能有許多不同的),我真的不想知道它知道這個類增加了我的代碼庫的依賴。

正在使用這些邊界反模式?如果是的話,最好怎麼避免呢?

案例情況涉及指定對象的一個​​接口是持久性的,而另一個指定對象具有相關實體。在這種情況下,doStuff(T a)函數在相關實體持續存在時持久化。但非持久實體也可以有相關的實體,但不應該由doStuff(T a)函數處理

+0

這個問題似乎涉及到[投地結合的通用(http://stackoverflow.com/questions/318208/cast-to-combined-generic)問題(由同一作者)。 – 2008-11-26 11:26:20

+0

它是,但我認爲這將是更好的清晰度,使之成爲一個不同的問題 – pvgoddijn 2008-11-26 13:09:25

+0

嗯,你知道有關它的一切很明顯,我只是在想其他人誰可能需要更多的背景:) – 2008-11-26 13:13:20

回答

3

我不會考慮組合泛型邊界的反模式。至少我在我的代碼中有一些用途。

<T extends Number & Comparable<T>> T max(Collection<T> numbers) 
1

在我看來,這需要知道特定類型的對象參數的傳遞給doStuff:例如,下面的示例代碼中使用的compareTo從可比界面發現的最大數量的實例集合中(T a)違反德米特定律

我不同意。我沒有看到

T<? extends Foo & Bar> void doStuff(T argument) 

如何,需要論證的任何更多的知識傳遞,然後

T<? extends Foo> void doStuff(T argument) 

甚至更​​多然後只是

void doStuff(T argument) 

在你需要了解一下所有的情況下我認爲第一種情況不需要更多的知識,因爲它有兩個標識符。

0

反模式是鑄造。

但是,花式泛型步法可能會讓非高級程序員感到困惑。這些類型和方法的使用應該比實現更容易。