2008-11-26 43 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

反模式是铸造。

但是,花式泛型步法可能会让非高级程序员感到困惑。这些类型和方法的使用应该比实现更容易。